在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

教大家如何在STM32F4上跑freeRTOS

FPGA之家 ? 來源:嵌入式客棧 ? 作者:逸珺 ? 2021-07-23 10:21 ? 次閱讀

[導讀] 大家好,我是逸珺。

之前挖了圖解freeRTOS的坑,挖了坑就得填。今天就從使用開始,先把freeRTOS用起來。先聊一聊在STM32F407上的如何電燈,如果只用freeRTOS點燈,無疑有點殺雞用牛刀的感覺。但是想用freeRTOS做產品,先照類似步驟則可以驗證最小系統,驗證freeRTOS是否能正確跑起來,再在此基礎上開始做應用開發,就把任務分解了。本文主要梳理一下如何利用官方移植例子,創建一個自己demo工程,對于沒用過的有點參考價值。

注:本文基于IAR for ARM 8.22.1(個人喜歡IAR),硬件采用正點原子的STM32F407探索者開發板,STLink V2。

準備工作去官網https://www.freertos.org/a00104.html下載

按下載,目前最新為202104.00,這個帶多種移植好的例子。解壓出來,是這樣的:

嵌入式客棧

tools為AWS iot配置工具,quick start例子以及cmake

FreeRTOS-Plus包含了MQTT,TCP,FAT等很多例子,先不去管

FreeRTOS為真正的操作系統源碼以及多平臺移植例子,如下:

嵌入式客棧

使用開源軟件,記得看看README,一般會有些介紹信息。分別介紹一下該文件夾下的大體內容:

Demo:大部分硬件平臺的官方移植例子

Source:內核代碼,包含硬件獨立文件與可移植文件

Test:內核測試代碼

license:MIT開源協議,可以直接商業應用。

建立工程1.打開IAR,創建Workspace

2.創建工程

嵌入式客棧

選擇空工程(Empty project),命名為demo保存。

嵌入式客棧

設置工程

右鍵選擇Options,進入設置界面

嵌入式客棧

設置單片機為STM32F407VG

嵌入式客棧

Library Configuration使能CMSIS

953fb36a-e10c-11eb-9e57-12bb97331649.png

添加源文件

4.1 新建freeRTOS文件夾

95542db8-e10c-11eb-9e57-12bb97331649.png

4.2 添加內核文件,在工程文件夾下新建freeRTOS文件夾,將下列文件拷貝過來

4.3 添加進IAR工程

4.4 將freeRTOS下的include文件夾以及portable文件夾拷貝到當前工程下

9577ca52-e10c-11eb-9e57-12bb97331649.png

4.5 portable文件夾下保留下面這幾個文件夾

嵌入式客棧

4.6 IAR文件夾下保留下面這兩個文件夾

嵌入式客棧

注:全保留也可以,就是其他的用不到,會使工程文件夾變的很大,如果用版本控制軟件管理,會增加倉庫的大小。ARM_CM4F_MPU文件夾暫時沒用,這個留做備用。

4.7 在IAR工程中新建portable文件夾,并加入相應的文件

嵌入式客棧

4.8 將下面幾個文件從官方例子中拷貝過來,并加入工程

FreeRTOSConfig.h是內核配置文件,本文配置如下:

#define configUSE_PREEMPTION 1#define configUSE_IDLE_HOOK 0#define configUSE_TICK_HOOK 0#define configCPU_CLOCK_HZ ( SystemCoreClock )#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )#define configMAX_PRIORITIES ( 5 )#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 130 )#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 75 * 1024 ) )#define configMAX_TASK_NAME_LEN ( 10 )#define configUSE_TRACE_FACILITY 1#define configUSE_16_BIT_TICKS 0#define configIDLE_SHOULD_YIELD 1#define configUSE_MUTEXES 1#define configQUEUE_REGISTRY_SIZE 8#define configCHECK_FOR_STACK_OVERFLOW 0#define configUSE_RECURSIVE_MUTEXES 1#define configUSE_MALLOC_FAILED_HOOK 0#define configUSE_APPLICATION_TASK_TAG 0#define configUSE_COUNTING_SEMAPHORES 1#define configGENERATE_RUN_TIME_STATS 0/* Co-routine definitions. */#define configUSE_CO_ROUTINES 0#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )/* Software timer definitions. */#define configUSE_TIMERS 1#define configTIMER_TASK_PRIORITY ( 2 )#define configTIMER_QUEUE_LENGTH 10#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE * 2 )/* Set the following definitions to 1 to include the API function, or zero

to exclude the API function. */#define INCLUDE_vTaskPrioritySet 1#define INCLUDE_uxTaskPriorityGet 1#define INCLUDE_vTaskDelete 1#define INCLUDE_vTaskCleanUpResources 1#define INCLUDE_vTaskSuspend 1#define INCLUDE_vTaskDelayUntil 1#define INCLUDE_vTaskDelay 1

將IDLE_HOOK/TICK_HOOK禁止了,先不去關注這兩個功能。

將STM32相關文件搬過來,如下加入到工程

建立main.c

正點原子的板子,有兩個LED,我們就建立兩個任務來閃燈吧,相當于hello world,容易理解。

嵌入式客棧

/* 操作系統頭文件。 */

#include “FreeRTOS.h”#include “task.h”#include “timers.h”#include “semphr.h”#include “stm32f4xx.h”

//LED管腳

#define LED1_PIN GPIO_Pin_9#define LED1_GPIO_PORT GPIOF#define LED1_GPIO_CLK RCC_AHB1Periph_GPIOF

#define LED2_PIN GPIO_Pin_10#define LED2_GPIO_PORT GPIOF#define LED2_GPIO_CLK RCC_AHB1Periph_GPIOF

static void prvLedInitialise()

{

GPIO_InitTypeDef GPIO_InitStructure;

/* LED1時能時鐘 */

RCC_AHB1PeriphClockCmd(LED1_GPIO_CLK, ENABLE);

/* LED1 GPIO 配置為輸出 */

GPIO_InitStructure.GPIO_Pin = LED1_PIN;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);

/* LED2時能時鐘 */

RCC_AHB1PeriphClockCmd(LED2_GPIO_CLK, ENABLE);

/* LED2 GPIO配置為輸出 */

GPIO_InitStructure.GPIO_Pin = LED2_PIN;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);

}

static void prvSetupHardware( void )

{

/* 配置時鐘,PLL,FLASH */

SystemInit();

/* 配置NVIC優先級。 */

NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );

/*LED GPIO配置*/

prvLedInitialise();

}

//500ms LED1燈狀態翻轉一次

static void led1Task( void * pvParameters )

{

while(1)

{

LED1_GPIO_PORT-》ODR ^= LED1_PIN;

vTaskDelay(500);

}

}

//1000ms LED2燈狀態翻轉一次

static void led2Task( void * pvParameters )

{

while(1)

{

LED2_GPIO_PORT-》ODR ^= LED2_PIN;

vTaskDelay(1000);

}

}

int main(void)

{

prvSetupHardware();

xTaskCreate(led1Task,“LED1”,256,NULL,100,(TaskHandle_t *)NULL);

xTaskCreate(led2Task,“LED2”,256,NULL,101,(TaskHandle_t *)NULL);

/* 啟動任務調度器。 */

vTaskStartScheduler();

}

5.設置包含路徑

5.1 右鍵打開options,設置C/C++編譯器包含路徑

5.2 設置包含路徑為:

$PROJECT_DIR$是一個變量,表示當前路徑,不要設成絕對路徑,否則拷貝到不同路徑就無法編譯了。

$PROJ_DIR$

$PROJ_DIR$halCMSISDeviceSTSTM32F4xxInclude

$PROJ_DIR$halSTM32F4xx_StdPeriph_Driverinc

$PROJ_DIR$freeRTOSinclude

$PROJ_DIR$freeRTOSportableIARARM_CM4F

$PROJ_DIR$Commoninclude示當前工程目錄,利用這個變量就可以設置和工程相關的路徑了,不要設置為絕對路徑,否則如果工程拷貝到其他路徑,就無法正確編譯了。

并設置兩個宏:

USE_STDPERIPH_DRIVER

STM32F4XX

5.3 設置匯編器包含路徑

嵌入式客棧

6. 設置鏈接配置文件

嵌入式客棧

注:如果遇到下面的錯誤,應該是你使用了老版本的startup_stm32f4xx.s

Warning[25]: Label ‘CAN2_SCE_IRQHandler’ is defined pubweak in a section implicitly declared root

官方例子中下面路徑的startup_stm32f4xx.s為老版本

CMSISDeviceSTSTM32F4xxSourceTemplatesiar

該警告詳細信息可參考:

https://www.iar.com/knowledge/support/technical-notes/assembler/warning25-label-xxxxx-is-defined-pubweak-in-a-section-implicitly-declared-root/

編譯運行

嵌入式客棧

設置ST-Link

嵌入式客棧

總結一下官方的例子,要直接拿來開發產品有很多不需要的文件,可以按照本文的步驟做些刪減,先建立這樣一個基本工程,然后就可以結合自己的實際硬件以及需求,開始做應用開發了。

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • STM32F4
    +關注

    關注

    3

    文章

    194

    瀏覽量

    28669

原文標題:手把手教你在STM32F4上跑freeRTOS

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Arduino中可以使用STM32F1或者STM32F4系列芯片的內置看門狗嗎?

    Arduino中可以使用STM32F1或者STM32F4系列芯片的內置看門狗嗎
    發表于 03-13 07:32

    使用STM32F4的ADC的時候,發現測量結果不準確,是什么原因導致的?

    請教各位大佬一個問題,我在使用STM32F4的ADC的時候,發現測量結果不準確。上網查看教程,發現F1系列有自動校準的函數,但是F4沒有校準相關的設置,想請教一下是F4的HAL庫把校準
    發表于 03-11 06:29

    stm32f4 sdio時鐘如何獲取通過什么函數?

    stm32f4系列sdio 時鐘如何獲取,stm32h7可以通過sdmmc_clk=HAL_RCCEx_GetPeriphCLKFreq(STM32_RCC_PERIPHCLK_SDMMC);這個函數獲取
    發表于 03-07 08:26

    STM32項目實戰:基于STM32F4的智能燈光控制系統(LVGL),附項目教程/源碼

    《智能燈光控制系統_STM32F4》項目完整文檔、項目源碼,私信小雯老師免費領取。STM32項目實戰之“智能燈光控制系統”(基于STM32F4)今天小編來分享一個《智能燈光控制系統》的項目案例,硬件
    的頭像 發表于 10-17 16:16 ?1420次閱讀
    <b class='flag-5'>STM32</b>項目實戰:基于<b class='flag-5'>STM32F4</b>的智能燈光控制系統(LVGL),附項目教程/源碼

    何在RT-thread studio的裸機例程移植freertos?

    何在RT-thread studio的裸機例程移植freertos
    發表于 09-13 06:32

    在TM4C MCU使用FreeRTOS開發高級應用

    電子發燒友網站提供《在TM4C MCU使用FreeRTOS開發高級應用.pdf》資料免費下載
    發表于 09-06 10:17 ?2次下載
    在TM<b class='flag-5'>4</b>C MCU<b class='flag-5'>上</b>使用<b class='flag-5'>FreeRTOS</b>開發高級應用

    STM32F40xxx、STM32F41xxx、STM32F42xxx、STM32F43xxx中文手冊

    STM32F4系列單片機中文手冊
    發表于 08-08 14:32 ?2次下載

    何在FreeRTOS操作系統RT-Thread?

    我現在有個項目用的MCU 內核是很小眾的,芯片廠家僅支持freertos,我現在想把rt-thread弄上去,不知道該怎么實現開關中斷以及上下文切換等,能提供幫助嗎? 底層繼續使用freertos,我在應用中使用rt-thr
    發表于 07-09 08:30

    STM32F4系列有對PI/SI仿真要求的文件嗎?

    STM32F4系列有對PI/SI仿真要求的文件嗎?比如PDN Targets and Decoupling Example SI信號要求
    發表于 07-02 06:26

    請問STM32F4系列有對PI/SI仿真要求的文件嗎?

    STM32F4系列有對PI/SI仿真要求的文件嗎?
    發表于 06-03 06:25

    stm32f4ucos+emwin5.16 gui_init()初始化失敗的原因?

    我用stm32f4discovery 連了一塊ra8875的4.3寸屏幕, ucosii已經移植成功了,但是移植emwin5。16的時候在gui初始化的時候就會進入 HardFault_Handler(); 不知道是什么情況; 單獨emwin 也能跑,為什么和ucos放
    發表于 05-17 12:33

    請問stm32f4的dsp庫里面fir函數如何使用?

    請問在stm32f4 的dsp庫里面有好幾個關于fir的函數,因為沒有源碼,我也沒有什么關于這個dsp函數的介紹,所以看不懂這些函數怎么用呢。比如說void arm_fir_init_q31
    發表于 05-17 08:07

    STM32f4采集的視頻怎么在電腦顯示?

    我用stm32f4采集到的視頻想通過網線傳輸到電腦,在電腦顯示采集到的視頻,有沒有大神做個過視頻傳輸啊,我該怎么弄?????
    發表于 05-14 08:25

    stm32f4批量燒錄,用什么軟件?

    請問,stm32f4批量燒錄,用什么軟件
    發表于 05-09 06:02

    STM32F4驅動MMC,返回的CID和CSD數據都為0是怎么回事?

    STM32F4驅動MMC,返回的CID和CSD數據都為0
    發表于 04-19 08:07
    主站蜘蛛池模板: 免费看片免费播放 | 亚洲香蕉久久一区二区三区四区 | 另类性欧美喷潮videofree | 特黄aaaaa日本大片免费看 | 天天爽天天狼久久久综合 | 人人爱干 | 欧美一卡二卡3卡4卡无卡六卡七卡科普 | 黄色网址免费在线 | 欧美五月婷婷 | 日本68xxxxxxxxx老师 | 在线黄色大片 | 欧洲另类一二三四区 | 一级做a爰片久久毛片图片 一级做a爰片久久毛片鸭王 | 免费看美女禁处爆涌视频 | 天天操天天艹 | 国产精品美女久久久久网站 | www.夜| 色综合天天综合给合国产 | 久久国产精品99精品国产987 | 色综合久久综合欧美综合网 | 完整日本特级毛片 | 日本三级a| 午夜免费啪在线观看视频网站 | 婷婷免费高清视频在线观看 | 在线种子搜索 | 色网站在线看 | 天天色天天操天天射 | 亚洲一区二区在线视频 | 国产精品国产三级在线高清观看 | 午夜国产精品福利在线观看 | 亚洲色图 欧美 | 日本人的色道www免费一区 | 免费啪视频在线观看 | 亚洲成av人影片在线观看 | 男人天堂欧美 | 1024毛片| 欧美一区二区三区性 | 精品视频一区二区三区四区五区 | 亚洲天天做日日做天天看2018 | 欧美午夜性 | 欧美性猛交xxxx |