0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

教大家如何在STM32F4上跑freeRTOS

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

[導(dǎo)讀] 大家好,我是逸珺。

之前挖了圖解freeRTOS的坑,挖了坑就得填。今天就從使用開(kāi)始,先把freeRTOS用起來(lái)。先聊一聊在STM32F407上的如何電燈,如果只用freeRTOS點(diǎn)燈,無(wú)疑有點(diǎn)殺雞用牛刀的感覺(jué)。但是想用freeRTOS做產(chǎn)品,先照類(lèi)似步驟則可以驗(yàn)證最小系統(tǒng),驗(yàn)證freeRTOS是否能正確跑起來(lái),再在此基礎(chǔ)上開(kāi)始做應(yīng)用開(kāi)發(fā),就把任務(wù)分解了。本文主要梳理一下如何利用官方移植例子,創(chuàng)建一個(gè)自己demo工程,對(duì)于沒(méi)用過(guò)的有點(diǎn)參考價(jià)值。

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

準(zhǔn)備工作去官網(wǎng)https://www.freertos.org/a00104.html下載

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

嵌入式客棧

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

FreeRTOS-Plus包含了MQTT,TCP,F(xiàn)AT等很多例子,先不去管

FreeRTOS為真正的操作系統(tǒng)源碼以及多平臺(tái)移植例子,如下:

嵌入式客棧

使用開(kāi)源軟件,記得看看README,一般會(huì)有些介紹信息。分別介紹一下該文件夾下的大體內(nèi)容:

Demo:大部分硬件平臺(tái)的官方移植例子

Source:內(nèi)核代碼,包含硬件獨(dú)立文件與可移植文件

Test:內(nèi)核測(cè)試代碼

license:MIT開(kāi)源協(xié)議,可以直接商業(yè)應(yīng)用。

建立工程1.打開(kāi)IAR,創(chuàng)建Workspace

2.創(chuàng)建工程

嵌入式客棧

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

嵌入式客棧

設(shè)置工程

右鍵選擇Options,進(jìn)入設(shè)置界面

嵌入式客棧

設(shè)置單片機(jī)為STM32F407VG

嵌入式客棧

Library Configuration使能CMSIS

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

添加源文件

4.1 新建freeRTOS文件夾

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

4.2 添加內(nèi)核文件,在工程文件夾下新建freeRTOS文件夾,將下列文件拷貝過(guò)來(lái)

4.3 添加進(jìn)IAR工程

4.4 將freeRTOS下的include文件夾以及portable文件夾拷貝到當(dāng)前工程下

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

4.5 portable文件夾下保留下面這幾個(gè)文件夾

嵌入式客棧

4.6 IAR文件夾下保留下面這兩個(gè)文件夾

嵌入式客棧

注:全保留也可以,就是其他的用不到,會(huì)使工程文件夾變的很大,如果用版本控制軟件管理,會(huì)增加倉(cāng)庫(kù)的大小。ARM_CM4F_MPU文件夾暫時(shí)沒(méi)用,這個(gè)留做備用。

4.7 在IAR工程中新建portable文件夾,并加入相應(yīng)的文件

嵌入式客棧

4.8 將下面幾個(gè)文件從官方例子中拷貝過(guò)來(lái),并加入工程

FreeRTOSConfig.h是內(nèi)核配置文件,本文配置如下:

#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禁止了,先不去關(guān)注這兩個(gè)功能。

將STM32相關(guān)文件搬過(guò)來(lái),如下加入到工程

建立main.c

正點(diǎn)原子的板子,有兩個(gè)LED,我們就建立兩個(gè)任務(wù)來(lái)閃燈吧,相當(dāng)于hello world,容易理解。

嵌入式客棧

/* 操作系統(tǒng)頭文件。 */

#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時(shí)能時(shí)鐘 */

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時(shí)能時(shí)鐘 */

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 )

{

/* 配置時(shí)鐘,PLL,F(xiàn)LASH */

SystemInit();

/* 配置NVIC優(yōu)先級(jí)。 */

NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );

/*LED GPIO配置*/

prvLedInitialise();

}

//500ms LED1燈狀態(tài)翻轉(zhuǎn)一次

static void led1Task( void * pvParameters )

{

while(1)

{

LED1_GPIO_PORT-》ODR ^= LED1_PIN;

vTaskDelay(500);

}

}

//1000ms LED2燈狀態(tài)翻轉(zhuǎn)一次

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);

/* 啟動(dòng)任務(wù)調(diào)度器。 */

vTaskStartScheduler();

}

5.設(shè)置包含路徑

5.1 右鍵打開(kāi)options,設(shè)置C/C++編譯器包含路徑

5.2 設(shè)置包含路徑為:

$PROJECT_DIR$是一個(gè)變量,表示當(dāng)前路徑,不要設(shè)成絕對(duì)路徑,否則拷貝到不同路徑就無(wú)法編譯了。

$PROJ_DIR$

$PROJ_DIR$halCMSISDeviceSTSTM32F4xxInclude

$PROJ_DIR$halSTM32F4xx_StdPeriph_Driverinc

$PROJ_DIR$freeRTOSinclude

$PROJ_DIR$freeRTOSportableIARARM_CM4F

$PROJ_DIR$Commoninclude示當(dāng)前工程目錄,利用這個(gè)變量就可以設(shè)置和工程相關(guān)的路徑了,不要設(shè)置為絕對(duì)路徑,否則如果工程拷貝到其他路徑,就無(wú)法正確編譯了。

并設(shè)置兩個(gè)宏:

USE_STDPERIPH_DRIVER

STM32F4XX

5.3 設(shè)置匯編器包含路徑

嵌入式客棧

6. 設(shè)置鏈接配置文件

嵌入式客棧

注:如果遇到下面的錯(cuò)誤,應(yīng)該是你使用了老版本的startup_stm32f4xx.s

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

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

CMSISDeviceSTSTM32F4xxSourceTemplatesiar

該警告詳細(xì)信息可參考:

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

編譯運(yùn)行

嵌入式客棧

設(shè)置ST-Link

嵌入式客棧

總結(jié)一下官方的例子,要直接拿來(lái)開(kāi)發(fā)產(chǎn)品有很多不需要的文件,可以按照本文的步驟做些刪減,先建立這樣一個(gè)基本工程,然后就可以結(jié)合自己的實(shí)際硬件以及需求,開(kāi)始做應(yīng)用開(kāi)發(fā)了。

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • STM32F4
    +關(guān)注

    關(guān)注

    3

    文章

    194

    瀏覽量

    27950

原文標(biāo)題:手把手教你在STM32F4上跑freeRTOS

文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32項(xiàng)目實(shí)戰(zhàn):基于STM32F4的智能燈光控制系統(tǒng)(LVGL),附項(xiàng)目教程/源碼

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

    STM32F40xxx、STM32F41xxx、STM32F42xxx、STM32F43xxx中文手冊(cè)

    STM32F4系列單片機(jī)中文手冊(cè)
    發(fā)表于 08-08 14:32 ?2次下載

    何在FreeRTOS操作系統(tǒng)RT-Thread?

    我現(xiàn)在有個(gè)項(xiàng)目用的MCU 內(nèi)核是很小眾的,芯片廠家僅支持freertos,我現(xiàn)在想把rt-thread弄上去,不知道該怎么實(shí)現(xiàn)開(kāi)關(guān)中斷以及上下文切換等,能提供幫助嗎? 底層繼續(xù)使用freertos,我在應(yīng)用中使用rt-thr
    發(fā)表于 07-09 08:30

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

    我用stm32f4采集到的視頻想通過(guò)網(wǎng)線傳輸?shù)诫娔X,在電腦顯示采集到的視頻,有沒(méi)有大神做個(gè)過(guò)視頻傳輸啊,我該怎么弄?????
    發(fā)表于 05-14 08:25

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

    請(qǐng)問(wèn),stm32f4批量燒錄,用什么軟件
    發(fā)表于 05-09 06:02

    stm32f4 FLASH_ProgramDoubleWord函數(shù)數(shù)據(jù)不能寫(xiě)入flash的原因?

    STM32F401芯片,調(diào)用flash寫(xiě)函數(shù)時(shí),如果寫(xiě)一個(gè)字,也就是調(diào)用stm32f4 FLASH_ProgramWord函數(shù),能正確寫(xiě)入;如果換成stm32f4 FLASH_ProgramDoubleWord函數(shù),數(shù)據(jù)不能寫(xiě)
    發(fā)表于 04-12 06:50

    STM32F1改用STM32F2或STM32F4芯片后,發(fā)現(xiàn)芯片根本不能正常工作怎么解決?

    曾有工程師反映,之前用STM32F1系列芯片好好的,后來(lái)因?yàn)楫a(chǎn)品需要,改用STM32F2或STM32F4芯片后,發(fā)現(xiàn)芯片根本不能正常工作,即使最簡(jiǎn)單的程序也不順暢。
    發(fā)表于 04-08 06:45

    stm32F4 64位變量操作異常怎么解決?

    stm32F4 64位變量使用報(bào)錯(cuò)解決
    發(fā)表于 04-02 07:16

    STM32F4內(nèi)部的DAC可以分時(shí)復(fù)用嗎?

    請(qǐng)問(wèn),STM32F4內(nèi)部的DAC可以分時(shí)復(fù)用嗎?
    發(fā)表于 03-28 08:38

    請(qǐng)問(wèn)引腳數(shù)相同的STM32F2的程序可以直接運(yùn)行在STM32F4嗎?

    引腳數(shù)相同的STM32F2的程序可以直接運(yùn)行在STM32F4的芯片嗎?手冊(cè)上說(shuō)F4全兼容F2的軟件
    發(fā)表于 03-27 07:43

    stm32FREERTOS的延時(shí)函數(shù)osDelayUntil()死機(jī)的原因?

    我在使用STM32F4freertos的時(shí)候發(fā)現(xiàn)一旦使用osDelayUntil()函數(shù),就會(huì)死機(jī),但是用osDelay()函數(shù)就不會(huì),按理說(shuō)不是都可以用的嗎?有知道原因的嗎,謝謝!
    發(fā)表于 03-22 07:56

    STM32F4的裸機(jī)源碼可以移植到linux ARM運(yùn)行嗎? 具體需要怎么實(shí)現(xiàn)呢?

    STM32F4的裸機(jī)源碼可以移植到linux ARM開(kāi)發(fā)板運(yùn)行嗎? 具體需要怎么實(shí)現(xiàn)呢?
    發(fā)表于 03-20 07:00

    STM32G071RBT6可以freertos嗎?

    STM32G071RBT6可以freertos
    發(fā)表于 03-14 07:12

    使用STM32F4芯片驗(yàn)證SPI功能的問(wèn)題分析

    有人使用STM32F4芯片驗(yàn)證SPI功能。當(dāng)使用片內(nèi)兩個(gè)SPI模塊基于中斷方式進(jìn)行收發(fā)時(shí),發(fā)現(xiàn)總是出現(xiàn)接收數(shù)據(jù)丟失的情況,貌似總丟失末尾2個(gè)數(shù)據(jù)。代碼使用HAL庫(kù)提供的API函數(shù)。這是怎么回事呢?
    的頭像 發(fā)表于 12-11 09:20 ?1860次閱讀
    使用<b class='flag-5'>STM32F4</b>芯片驗(yàn)證SPI功能的問(wèn)題分析

    何在AT32F系列MCU使用FreeRTOS

    本指導(dǎo)手冊(cè)描述了如何在AT32F系列MCU使用FreeRTOSFreeRTOS是一款開(kāi)源的嵌入式實(shí)時(shí)操作系統(tǒng),目前在各種嵌入式應(yīng)用中應(yīng)用
    發(fā)表于 10-24 07:46