0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何利用官方移植例子,创建一个自己demo工程

FPGA之家 ? 来源:FPGA之家 ? 作者:FPGA之家 ? 2022-05-17 10:02 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

[导读] 大家好,我是逸珺。

之前挖了图解freeRTOS的坑,挖了坑就得填。今天就从使用开始,先把freeRTOS用起来。先聊一聊在STM32F407上的如何电灯,如果只用freeRTOS点灯,无疑有点杀鸡用牛刀的感觉。但是想用freeRTOS做产品,先照类似步骤则可以验证最小系统,验证freeRTOS是否能正确跑起来,再在此基础上开始做应用开发,就把任务分解了。本文主要梳理一下如何利用官方移植例子,创建一个自己demo工程,对于没用过的有点参考价值。

注:本文基于IAR for ARM 8.22.1(个人喜欢IAR),硬件采用正点原子的STM32F407探索者开发板,STLink V2。

准备工作

去官网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,FAT等很多例子,先不去管
  • FreeRTOS为真正的操作系统源码以及多平台移植例子,如下:

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

使用开源软件,记得看看README,一般会有些介绍信息。分别介绍一下该文件夹下的大体内容:
  1. Demo:大部分硬件平台的官方移植例子
  2. Source:内核代码,包含硬件独立文件与可移植文件
  3. Test:内核测试代码
  4. license:MIT开源协议,可以直接商业应用。

建立工程

1.打开IAR,创建Workspace

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

2.创建工程

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 添加内核文件,在工程文件夹下新建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是内核配置文件,本文配置如下:

  • #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禁止了,先不去关注这两个功能。

  • 将STM32相关文件搬过来,如下加入到工程

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

  • 建立main.c

    正点原子的板子,有两个LED,我们就建立两个任务来闪灯吧,相当于hello world,容易理解。

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

  • /*操作系统头文件.*/
    #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优先级.*/
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
    
    /*LEDGPIO配置*/
    prvLedInitialise();
    }
    
    //500msLED1灯状态翻转一次
    staticvoidled1Task(void*pvParameters)
    {
    while(1)
    {
    LED1_GPIO_PORT->ODR^=LED1_PIN;
    vTaskDelay(500);
    }
    }
    //1000msLED2灯状态翻转一次
    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);
    
    /*启动任务调度器.*/
    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示当前工程目录,利用这个变量就可以设置和工程相关的路径了,不要设置为绝对路径,否则如果工程拷贝到其他路径,就无法正确编译了。

    并设置两个宏:

    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

闪灯效果

总结一下

官方的例子,要直接拿来开发产品有很多不需要的文件,可以按照本文的步骤做些删减,先建立这样一个基本工程,然后就可以结合自己的实际硬件以及需求,开始做应用开发了。

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2296

    文章

    11040

    浏览量

    366819
  • FreeRTOS
    +关注

    关注

    13

    文章

    495

    浏览量

    64769

原文标题:手把手教你在STM32F4上跑freeRTOS

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何移植 RT-Thread Nano 并创建 2 线程?

    基于 BSP 中的 GPIO_OutputInput 演示,展示了如何移植 RT-Thread Nano 并创建 2 线程。
    发表于 08-19 07:45

    如何打造属于自己的手势识别应用

    期小编给大家介绍了和MediaPipe的相遇之路,本期小编将带着大家起来动手,如何打造属于自己的手势识别应用。
    的头像 发表于 07-29 10:12 ?338次阅读
    如何打造<b class='flag-5'>一</b><b class='flag-5'>个</b>属于<b class='flag-5'>自己</b>的手势识别应用

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

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

    【RA4L1-SENSOR】1、开箱、Keil环境开发和官方示例移植

    Mircolib用于使用printf函数。 取消运行工程编译的前处理和后处理指令。 修改编译器的下载设置。 使用FSP配置工具,可以方便地设置外设驱动,操作便捷。 3、移植官方示例程序 瑞萨
    发表于 06-17 21:00

    RT-Thread Nano移植后动态创建线程创建不了怎么处理?

    RT-Thread Nano移植后动态创建线程创建不了,静态可以.直接烧录DEMO样,将RT_USING_HEAP开起来,使用动态
    发表于 06-11 06:36

    用RT-Thread Studio新建了DEMO工程,为什么不能调试?

    用RT-Thread Studio新建了DEMO工程,可以编译下载,但是不能调试,会报如下图的错误,这是为什么?
    发表于 06-10 06:47

    如何创建ESP32P4自定义工程移植示例和注意事项

    现的结果中,查看相关的组件,其中有ESP32_P4_Function_EV_Board的BSP支持包,查看组件的页面。 点击右上角的“Install”即可添加组件到工程中。在工程中就添加
    发表于 05-03 16:16

    STM32如何移植Audio框架?

    最近在学习音频解码,想用下Audio框架。 1、这个该如何移植自己创建的BSP并对接到device框架中?看了官方
    发表于 04-01 08:08

    FreeRTOS(V9.0)中创建信号量的函数都没有被定义,因此用不了,怎么解决

    问题背景:我想要使用信号量,结果查找了整个工程都没有创建信号量的函数。我还以为是我自己移植有问题,因此还特地下载了其他人移植好的
    发表于 03-13 09:30

    移植LWIP+FREERTOS时遇到的问题怎么解决?

    :将ST官网的LWIP1.4.1 的例子(关于LWIP的部分)移植到步骤1 的FreeRTOS 系统的工程里面,只是添加LWIP初始化的任务,并没有调用任何接口的情况下可以Ping 通 而且长时间
    发表于 03-11 06:48

    详解Object Detection Demo移植

    继上移植了 Mediapipe 的 LLM Inference 后,这篇文章我们将继续探索 Object Detection Demo移植
    的头像 发表于 02-05 13:42 ?569次阅读
    详解Object Detection <b class='flag-5'>Demo</b>的<b class='flag-5'>移植</b>

    MIPI2.5G DPHY CSI2DSI demo移植 -v1

    最近陆续有客户在评估易灵思的Ti180。Ti180的MIPI 2.5G是硬核。今天做一个简单的移植来试验下MIPI DSI 驱屏。 因为有客户需要,所以也把程序移植到了公司的demo
    的头像 发表于 01-21 16:56 ?1427次阅读
    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 的深入细节分析,同时也是后面几篇同类型文章的开头。
    的头像 发表于 12-05 16:29 ?1273次阅读
    <b class='flag-5'>移植</b>Mediapipe LLM <b class='flag-5'>Demo</b>到Kotlin Multiplatform

    如何用VSCODE创建LE5010的工程模板

    我想问下,就是怎么用vscode来创建LE5010的工程模板,我看网上的资料很少很少,官方给的SDK有,但是只能SDK里面来写代码,所以就想问问! (有偿)
    发表于 12-04 10:01

    多平台FPGA工程快速移植与构建

    作为名FPGA工程师,经常需要在多个FPGA设备之间移植项目,核心的问题是IP的管理和移植,今天通过安装和使用 FuseSoC 在多个 AMD FPGA 之间
    的头像 发表于 11-20 16:12 ?2048次阅读
    多平台FPGA<b class='flag-5'>工程</b>快速<b class='flag-5'>移植</b>与构建