一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

FPGA之家 ? 來源:FPGA之家 ? 作者:FPGA之家 ? 2022-05-17 10:02 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

準備工作

去官網(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è)應用。

建立工程

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. 設置工程

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

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

  1. 設置單片機為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 添加進IAR工程

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

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

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文件夾,并加入相應的文件

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,我們就建立兩個任務來閃燈吧,相當于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);
    
    /*啟動任務調(diào)度器.*/
    vTaskStartScheduler();
    }
    

5.設置包含路徑

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

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

5.2 設置包含路徑為:

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

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

    并設置兩個宏:

    USE_STDPERIPH_DRIVER
    STM32F4XX
    

5.3 設置匯編器包含路徑

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

6. 設置鏈接配置文件

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

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

Warning[25]:Label'CAN2_SCE_IRQHandler'isdefinedpubweakinasectionimplicitlydeclaredroot

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

編譯運行

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

設置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é)合自己的實際硬件以及需求,開始做應用開發(fā)了。

審核編輯 :李倩


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

    關(guān)注

    2293

    文章

    11032

    瀏覽量

    364785
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    493

    瀏覽量

    64316

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    CYW43907系列在ModusToolbox的工程是否可以移植到Keil uVision中?

    CYW43907系列在ModusToolbox的工程是否可以移植到Keil uVision中,看見了官方推出的移植文檔,但是不知道是否支持此芯片
    發(fā)表于 07-08 06:48

    【RA4L1-SENSOR】1、開箱、Keil環(huán)境開發(fā)和官方示例移植

    Mircolib用于使用printf函數(shù)。 取消運行工程編譯的前處理和后處理指令。 修改編譯器的下載設置。 使用FSP配置工具,可以方便地設置外設驅(qū)動,操作便捷。 3、移植官方示例程序 瑞薩
    發(fā)表于 06-17 21:00

    RT-Thread Nano移植后動態(tài)創(chuàng)建線程創(chuàng)建不了怎么處理?

    RT-Thread Nano移植后動態(tài)創(chuàng)建線程創(chuàng)建不了,靜態(tài)可以.直接燒錄DEMO樣,將RT_USING_HEAP開起來,使用動態(tài)
    發(fā)表于 06-11 06:36

    用RT-Thread Studio新建了DEMO工程,為什么不能調(diào)試?

    用RT-Thread Studio新建了DEMO工程,可以編譯下載,但是不能調(diào)試,會報如下圖的錯誤,這是為什么?
    發(fā)表于 06-10 06:47

    如何創(chuàng)建ESP32P4自定義工程、移植示例和注意事項

    現(xiàn)的結(jié)果中,查看相關(guān)的組件,其中有ESP32_P4_Function_EV_Board的BSP支持包,查看組件的頁面。 點擊右上角的“Install”即可添加組件到工程中。在工程中就添加
    發(fā)表于 05-03 16:16

    STM32如何移植Audio框架?

    最近在學習音頻解碼,想用下Audio框架。 1、這個該如何移植自己創(chuàng)建的BSP并對接到device框架中?看了官方
    發(fā)表于 04-01 08:08

    FreeRTOS(V9.0)中創(chuàng)建信號量的函數(shù)都沒有被定義,因此用不了,怎么解決

    問題背景:我想要使用信號量,結(jié)果查找了整個工程都沒有創(chuàng)建信號量的函數(shù)。我還以為是我自己移植有問題,因此還特地下載了其他人移植好的
    發(fā)表于 03-13 09:30

    移植LWIP+FREERTOS時遇到的問題怎么解決?

    :將ST官網(wǎng)的LWIP1.4.1 的例子(關(guān)于LWIP的部分)移植到步驟1 的FreeRTOS 系統(tǒng)的工程里面,只是添加LWIP初始化的任務,并沒有調(diào)用任何接口的情況下可以Ping 通 而且長時間
    發(fā)表于 03-11 06:48

    詳解Object Detection Demo移植

    繼上移植了 Mediapipe 的 LLM Inference 后,這篇文章我們將繼續(xù)探索 Object Detection Demo移植。
    的頭像 發(fā)表于 02-05 13:42 ?470次閱讀
    詳解Object Detection <b class='flag-5'>Demo</b>的<b class='flag-5'>移植</b>

    MIPI2.5G DPHY CSI2DSI demo移植 -v1

    最近陸續(xù)有客戶在評估易靈思的Ti180。Ti180的MIPI 2.5G是硬核。今天做一個簡單的移植來試驗下MIPI DSI 驅(qū)屏。 因為有客戶需要,所以也把程序移植到了公司的demo
    的頭像 發(fā)表于 01-21 16:56 ?1223次閱讀
    MIPI2.5G DPHY CSI2DSI <b class='flag-5'>demo</b><b class='flag-5'>移植</b> -v1

    移植Mediapipe LLM Demo到Kotlin Multiplatform

    在今年的廈門和廣州 Google I/O Extended 上,我分享了《On-Device Model 集成 (KMP) 與用例》。本文是當時 Demo 的深入細節(jié)分析,同時也是后面幾篇同類型文章的開頭。
    的頭像 發(fā)表于 12-05 16:29 ?1149次閱讀
    <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設備之間移植項目,核心的問題是IP的管理和移植,今天通過安裝和使用 FuseSoC 在多個 AMD FPGA 之間
    的頭像 發(fā)表于 11-20 16:12 ?1903次閱讀
    多平臺FPGA<b class='flag-5'>工程</b>快速<b class='flag-5'>移植</b>與構(gòu)建

    STM32407的板子通過CubeMX創(chuàng)建項目移植x-cube-c,直提示Clock Source failure (Run-time)的原因?

    我使用CubeMX創(chuàng)建工程并參考例程移植x-cube-classb,做運行時檢測的時候
    發(fā)表于 07-23 07:37

    是否能將libwebsokets移植到ESP8266上利用libwebsokets進行網(wǎng)絡應用開發(fā)?

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