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

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

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

如何利用官方移植例子,創(chuàng)建一個自己demo工程

FPGA之家 ? 來源:FPGA之家 ? 作者:FPGA之家 ? 2022-05-17 10:02 ? 次閱讀

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

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

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

準(zhǔn)備工作

去官網(wǎng)https://www.freertos.org/a00104.html下載

3f84380c-d57a-11ec-bce3-dac502259ad0.png

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

3fc0ecc0-d57a-11ec-bce3-dac502259ad0.png

  • tools為AWS iot配置工具,quick start例子以及cmake
  • FreeRTOS-Plus包含了MQTT,TCP,F(xiàn)AT等很多例子,先不去管
  • FreeRTOS為真正的操作系統(tǒng)源碼以及多平臺移植例子,如下:

3fdfc8ca-d57a-11ec-bce3-dac502259ad0.png

使用開源軟件,記得看看README,一般會有些介紹信息。分別介紹一下該文件夾下的大體內(nèi)容:
  1. Demo:大部分硬件平臺的官方移植例子
  2. Source:內(nèi)核代碼,包含硬件獨立文件與可移植文件
  3. Test:內(nèi)核測試代碼
  4. license:MIT開源協(xié)議,可以直接商業(yè)應(yīng)用。

建立工程

1.打開IAR,創(chuàng)建Workspace

4004a492-d57a-11ec-bce3-dac502259ad0.png

2.創(chuàng)建工程

4026655a-d57a-11ec-bce3-dac502259ad0.png

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

403f24d2-d57a-11ec-bce3-dac502259ad0.png

  1. 設(shè)置工程

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

40971fe8-d57a-11ec-bce3-dac502259ad0.png

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

40b95f0e-d57a-11ec-bce3-dac502259ad0.png

  1. Library Configuration使能CMSIS

411f1344-d57a-11ec-bce3-dac502259ad0.png

  1. 添加源文件

    4.1 新建freeRTOS文件夾

413479e6-d57a-11ec-bce3-dac502259ad0.png

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

4150a13e-d57a-11ec-bce3-dac502259ad0.png

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

417146f0-d57a-11ec-bce3-dac502259ad0.png

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

418f0550-d57a-11ec-bce3-dac502259ad0.png

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

41a7a448-d57a-11ec-bce3-dac502259ad0.png

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

41bc3ff2-d57a-11ec-bce3-dac502259ad0.png

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

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

41eb619c-d57a-11ec-bce3-dac502259ad0.png

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

4221da06-d57a-11ec-bce3-dac502259ad0.png

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

  • #defineconfigUSE_PREEMPTION1
    #defineconfigUSE_IDLE_HOOK0
    #defineconfigUSE_TICK_HOOK0
    #defineconfigCPU_CLOCK_HZ(SystemCoreClock)
    #defineconfigTICK_RATE_HZ((TickType_t)1000)
    #defineconfigMAX_PRIORITIES(5)
    #defineconfigMINIMAL_STACK_SIZE((unsignedshort)130)
    #defineconfigTOTAL_HEAP_SIZE((size_t)(75*1024))
    #defineconfigMAX_TASK_NAME_LEN(10)
    #defineconfigUSE_TRACE_FACILITY1
    #defineconfigUSE_16_BIT_TICKS0
    #defineconfigIDLE_SHOULD_YIELD1
    #defineconfigUSE_MUTEXES1
    #defineconfigQUEUE_REGISTRY_SIZE8
    #defineconfigCHECK_FOR_STACK_OVERFLOW0
    #defineconfigUSE_RECURSIVE_MUTEXES1
    #defineconfigUSE_MALLOC_FAILED_HOOK0
    #defineconfigUSE_APPLICATION_TASK_TAG0
    #defineconfigUSE_COUNTING_SEMAPHORES1
    #defineconfigGENERATE_RUN_TIME_STATS0
    
    /*Co-routinedefinitions.*/
    #defineconfigUSE_CO_ROUTINES0
    #defineconfigMAX_CO_ROUTINE_PRIORITIES(2)
    
    /*Softwaretimerdefinitions.*/
    #defineconfigUSE_TIMERS1
    #defineconfigTIMER_TASK_PRIORITY(2)
    #defineconfigTIMER_QUEUE_LENGTH10
    #defineconfigTIMER_TASK_STACK_DEPTH(configMINIMAL_STACK_SIZE*2)
    
    /*Setthefollowingdefinitionsto1toincludetheAPIfunction,orzero
    toexcludetheAPIfunction.*/
    #defineINCLUDE_vTaskPrioritySet1
    #defineINCLUDE_uxTaskPriorityGet1
    #defineINCLUDE_vTaskDelete1
    #defineINCLUDE_vTaskCleanUpResources1
    #defineINCLUDE_vTaskSuspend1
    #defineINCLUDE_vTaskDelayUntil1
    #defineINCLUDE_vTaskDelay1
    

    將IDLE_HOOK/TICK_HOOK禁止了,先不去關(guān)注這兩個功能。

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

423ff356-d57a-11ec-bce3-dac502259ad0.png

  • 建立main.c

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

4258cf98-d57a-11ec-bce3-dac502259ad0.png

  • /*操作系統(tǒng)頭文件.*/
    #include"FreeRTOS.h"
    #include"task.h"
    #include"timers.h"
    #include"semphr.h"
    
    #include"stm32f4xx.h"
    //LED管腳
    #defineLED1_PIN GPIO_Pin_9
    #defineLED1_GPIO_PORTGPIOF
    #defineLED1_GPIO_CLKRCC_AHB1Periph_GPIOF
    
    #defineLED2_PINGPIO_Pin_10
    #defineLED2_GPIO_PORTGPIOF
    #defineLED2_GPIO_CLKRCC_AHB1Periph_GPIOF
    
    staticvoidprvLedInitialise()
    {
    GPIO_InitTypeDefGPIO_InitStructure;
    
    /*LED1時能時鐘*/
    RCC_AHB1PeriphClockCmd(LED1_GPIO_CLK,ENABLE);
    /*LED1GPIO配置為輸出*/
    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);
    /*LED2GPIO配置為輸出*/
    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);
    }
    
    staticvoidprvSetupHardware(void)
    {
    /*配置時鐘,PLL,FLASH*/
    SystemInit();
    
    /*配置NVIC優(yōu)先級.*/
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
    
    /*LEDGPIO配置*/
    prvLedInitialise();
    }
    
    //500msLED1燈狀態(tài)翻轉(zhuǎn)一次
    staticvoidled1Task(void*pvParameters)
    {
    while(1)
    {
    LED1_GPIO_PORT->ODR^=LED1_PIN;
    vTaskDelay(500);
    }
    }
    //1000msLED2燈狀態(tài)翻轉(zhuǎn)一次
    staticvoidled2Task(void*pvParameters)
    {
    while(1)
    {
    LED2_GPIO_PORT->ODR^=LED2_PIN;
    vTaskDelay(1000);
    }
    }
    
    intmain(void)
    {
    prvSetupHardware();
    
    xTaskCreate(led1Task,"LED1",256,NULL,100,(TaskHandle_t *)NULL);
    xTaskCreate(led2Task,"LED2",256,NULL,101,(TaskHandle_t *)NULL);
    
    /*啟動任務(wù)調(diào)度器.*/
    vTaskStartScheduler();
    }
    

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

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

42beec60-d57a-11ec-bce3-dac502259ad0.png

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

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

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

    并設(shè)置兩個宏:

    USE_STDPERIPH_DRIVER
    STM32F4XX
    

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

42f4ff62-d57a-11ec-bce3-dac502259ad0.png

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

43207d7c-d57a-11ec-bce3-dac502259ad0.png

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

Warning[25]:Label'CAN2_SCE_IRQHandler'isdefinedpubweakinasectionimplicitlydeclaredroot

官方例子中下面路徑的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/

編譯運行

43389c04-d57a-11ec-bce3-dac502259ad0.png

設(shè)置ST-Link

43833a84-d57a-11ec-bce3-dac502259ad0.png

下載運行

43c49592-d57a-11ec-bce3-dac502259ad0.png

43e2e470-d57a-11ec-bce3-dac502259ad0.gif

閃燈效果

總結(jié)一下

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

審核編輯 :李倩


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

    關(guān)注

    2270

    文章

    10915

    瀏覽量

    356751
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    484

    瀏覽量

    62274

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

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

收藏 人收藏

    評論

    相關(guān)推薦

    移植Mediapipe LLM Demo到Kotlin Multiplatform

    在今年的廈門和廣州 Google I/O Extended 上,我分享了《On-Device Model 集成 (KMP) 與用例》。本文是當(dāng)時 Demo 的深入細(xì)節(jié)分析,同時也是后面幾篇同類型文章的開頭。
    的頭像 發(fā)表于 12-05 16:29 ?317次閱讀
    <b class='flag-5'>移植</b>Mediapipe LLM <b class='flag-5'>Demo</b>到Kotlin Multiplatform

    如何用VSCODE創(chuàng)建LE5010的工程模板

    我想問下,就是怎么用vscode來創(chuàng)建LE5010的工程模板,我看網(wǎng)上的資料很少很少,官方給的SDK有,但是只能SDK里面來寫代碼,所以就想問問! (有償)
    發(fā)表于 12-04 10:01

    多平臺FPGA工程快速移植與構(gòu)建

    作為名FPGA工程師,經(jīng)常需要在多個FPGA設(shè)備之間移植項目,核心的問題是IP的管理和移植,今天通過安裝和使用 FuseSoC 在多個 AMD FPGA 之間
    的頭像 發(fā)表于 11-20 16:12 ?1005次閱讀
    多平臺FPGA<b class='flag-5'>工程</b>快速<b class='flag-5'>移植</b>與構(gòu)建

    是否能將libwebsokets移植到ESP8266上利用libwebsokets進(jìn)行網(wǎng)絡(luò)應(yīng)用開發(fā)?

    1. 如題目,請問是否能將 libwebsokets 移植到 ESP8266上 利用 libwebsokets進(jìn)行網(wǎng)絡(luò)應(yīng)用開發(fā)? 2. libwebsokets 是純C實現(xiàn),如何設(shè)置ESP8266
    發(fā)表于 07-22 06:22

    【xG24 Matter開發(fā)套件試用體驗】初上手開發(fā)板和官方IDE

    ”。 完成SDK安裝后,就可以開始使用開發(fā)套件了。 點燈作為名資深的“點燈工程師”,拿到塊開發(fā)板的第件事自然是用它來點燈啦。在官方ID
    發(fā)表于 07-13 22:20

    使用LSM6DSO16IS的ISPU的9軸數(shù)據(jù)的幾個疑問求解

    hub模塊里面的描述只有加速度和角速度,地磁的模塊如何在這個里面如何體現(xiàn)? 3.有沒有關(guān)于9軸ISPU設(shè)置輸出的簡單可移植的功能,感覺你們的例子雖然可以快速原型驗證,但是程序真是
    發(fā)表于 07-02 07:06

    請問light demo下如何添加esp_http_client例程?

    );*/ //app_wifi_initialise(); xTaskCreate(&http_test_task, \"http_test_task\", 8192, NULL, 5, NULL); } 2.官方現(xiàn)在是有有無將
    發(fā)表于 06-28 15:46

    更適合工程師和研究僧的FPGA提升課程

    各位編程精英er~ F學(xué)社打造的FPGA工程師培訓(xùn)班上線后,有不少同學(xué)后臺私信詢問:“能不能出個那種專門針對某個知識點的課程呢?我想針對自己的薄弱點深入學(xué)習(xí)?!? 貼心如我,當(dāng)然會滿足大家的學(xué)習(xí)
    發(fā)表于 06-05 10:09

    使用STM32CUBEMX創(chuàng)建基于RTOS的工程,互斥量創(chuàng)建不成功的原因?

    使用STM32CUBEMX創(chuàng)建基于RTOS的工程,使用了互斥量,但互斥量創(chuàng)建不成功
    發(fā)表于 05-15 07:22

    freertos移植到M0內(nèi)核的mcu直不成功的原因?

    都有官方demo,所以很簡單,我進(jìn)行移植的時候(使用工具為mdk),先是有已經(jīng)成功的裸機(jī)程序,然后將內(nèi)核相關(guān)的list.c,task.c
    發(fā)表于 04-28 06:30

    移植STEMWIN,用GUI Builder創(chuàng)建窗口和按鍵,按鍵里為啥只顯示第1字母呢?

    用SPI接口的240*240屏幕,移植了STEMWIN后出現(xiàn)了問題。 用GUI Builder創(chuàng)建窗口和按鍵,按鍵里為啥只顯示第1字母
    發(fā)表于 04-18 08:17

    STM32F769I-DISCO開發(fā)板跑TouchGFX里的demo卡死黑屏的原因?

    買的官方的STM32F769-DISCO開發(fā)板,下載SDK里的官方例程跑的很流暢。自己在TouchGFX上找到STM32F769-DISCO的demo后,生成的代碼、cubeMX配置、
    發(fā)表于 04-12 07:46

    【從0開始創(chuàng)建AWTK應(yīng)用程序】編譯應(yīng)用到RTOS平臺

    AWTK是基于C語言開發(fā)的跨平臺GUI框架。本系列文章介紹如何從0開始創(chuàng)建AWTK應(yīng)用程序,包括搭建開發(fā)調(diào)試環(huán)境、使用AWTK創(chuàng)建Hello工程并在模擬器上運行、將AWTK應(yīng)用程序移植
    的頭像 發(fā)表于 03-21 08:23 ?646次閱讀
    【從0開始<b class='flag-5'>創(chuàng)建</b>AWTK應(yīng)用程序】編譯應(yīng)用到RTOS平臺

    Infineon官網(wǎng)下載的Demo工程,Tasking編譯通過,移植Hightec報故障怎么解決?

    Demo工程在Tasking工程中,編譯成功。 按照論壇大神之前分享的資料移植至Hightec編譯器(lsl鏈接文件路徑已修改,頭文件已添加,),編譯報錯,如何解決?該在哪個文件夾下設(shè)
    發(fā)表于 02-20 08:11

    【基于Lattice MXO2的小腳丫FPGA核心板】工程創(chuàng)建和固件燒錄

    ; 8路用戶LED; 4路撥碼開關(guān); 4路按鍵; 36用戶可擴(kuò)展I/O(其中包括路SPI硬核接口和路I2C硬核接口) 支持的開發(fā)工具思德普開發(fā)的Web IDE以及Lattice官方
    發(fā)表于 01-31 21:01