返回列表 发新帖我要提问本帖赏金: 35.00元(功能说明)

[STM32F1] FreeRTOS 202212.01在STM32F1上的应用(小白学习)

[复制链接]
 楼主| 单片小菜 发表于 2023-9-22 18:26 | 显示全部楼层 |阅读模式
<
#申请原创#@21小跑堂
引:

      单片机上使用操作系统越来越普遍了,现在将FreeRTOS最简源码在单片机上的使用讲解一下,方便大家后续工作中的方便,这篇文章同时也适合在其它芯片上的应用。

一、下载最新版本的FreeRTOS

       两个地址可以进行下载,其一为官网下载:
https://www.freertos.org/zh-cn-cmn-s/

9ccbdedb46e3df394859508660810684
f5ad9ef2ea8a3e7cac0e7eb2c0de95a6
      另外一个是托管网站,托管网站的版本一般不是最新的:
https://sourceforge.net/projects/freertos/files/FreeRTOS/
1e877548537907cd0018fcc3701f495f

二、下载之后的文件夹介绍

0a8aea5fb2bd9f2c241ed43095bc65e7
    我们打开关注的FreeRTOS文件夹
afcc81ad94d322d693708bf9d32fb6bd
      打开Source文件夹
5d79247d4bc6fc8bab8ee459f916b44d
      使用keil进行环境搭建,我们需要打开portable文件夹
68473bb972391d8de70a2c43a5aad755
      重点关注MemMang(内存管理)
e87951702e21c062cd2c8390847d8a7e
      RVDS(内核选择)文件夹
3dd7d668419062a552b2e079973cef10

三、提取最简源码到工程模板目录中

      我们在工程模板里面创建一个FreeRTOS的文件夹
3f227f76a880600d2cb1016091a97828
      在文件夹中创建两个空的文件夹,命名为:src和port文件夹
b137c00320d6a405240e2c06c02d3ac2
    src文件夹主要保存FreeRTOS中的核心源文件;
    port文件夹中保存内存管理以及处理架构的文件;
e693161bfde643ae97bc526f41720259
    将portable文件夹中的两个文件夹拷贝到port文件夹中。
79536280b0111a5d21474c49ce7ef567
    最后拷贝include头文件到FreeRTOS文件夹中。
cdf7810ba45514995fe0695374dfd9ef
    将FreeRTOSConfig.h文件拷贝到user文件夹中,这部分是需要进行更改的。
c7db8729def2352b2e03d23eeb4d4fc2

四、进行工程的MDK设置操作

      在工程中增加刚刚拷贝到目录中的文件 fad83e202ee0830a774c9fe526969741
      分别是FreeRTOSConfig.h文件、croutine.c、event_groups.c、list.c、queue.c、stream_buffer.c、tasks.c、timers.c、port.c、heap_4.c文件,按照上面的形式进行排列。
      指定头文件的路径
      刚刚已经将源码添加在工程项目中了,编译的时候需要为这些源文件指定头文件的路径,不然编译会报错的。具有头文件的目录分别是user文件夹、include文件夹、ARM_CM3文件夹。进行MDK的设定即可完成。如下图片的操作即可。

e7e658cab8561a90e929a07771440a3b

五、修改FreeRTOSConfig.h文件

    增加头文件的引用   
#include "stm32f10x.h"
    将FreeRTOS中的xPortPendSVHandler和单片机的PendSV_Handler对应起来。
    将FreeRTOS中的vPortSVCHandler和单片机的SVC_Handler对应起来。进行如下定义:
#define xPortPendSVHandler    PendSV_Handler#define vPortSVCHandler       SVC_Handler

六、修改stm32f10x_it.c文件

    将void SVC_Handler(void)函数屏蔽,因为在第五部分已经进行了关联。
    将void PendSV_Handler(void)函数屏蔽,因为在第五部分已经进行了关联。
    添加心跳函数,首先需要进行引用外部函数操作:

externvoidxPortSysTickHandler(void);

    在如下部分进行定义即可。

voidSysTick_Handler(void)
{
​#if (INCLUDE_xTaskGetSchedulerState == 1 )
    if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
   {
#endif /* INCLUDE_xTaskGetSchedulerState */
        xPortSysTickHandler();
#if (INCLUDE_xTaskGetSchedulerState == 1 )
   }
#endif /* INCLUDE_xTaskGetSchedulerState */
}
       至此,大部分工作就已经做完了,下面以简单的创建任务及软件仿真的形式展现出来,软件仿真,仍然使用的是MDK自带的示波器功能进行仿真操作。

七、创建简单的任务

voidTask1_Entry(void *p_arg)
{
     for(;;)
     {
             flag1 =1;
             delay(100);
             flag1=0;
             delay(100);
     }
}
voidTask2_Entry(void *p_arg)
{
         for(;;)
        {
               flag2 =1;
               delay(100);
               flag2=0;
               delay(100);
          }
}
      将任务添加到主循环中,添加的方法如下:

       xTaskCreate((TaskFunction_t )Task2_Entry,
                         (constchar*    )"task2",
                         (uint16_t       )TASK2_STK_SIZE,
                         (void*          )NULL,
                         (UBaseType_t    )TASK2_TASK_PRIO,
                         (TaskHandle_t*  )&Task2Task_Handler);
       xTaskCreate((TaskFunction_t )Task1_Entry,
                         (constchar*    )"task1",
                         (uint16_t       )TASK1_STK_SIZE,
                         (void*          )NULL,
                         (UBaseType_t    )TASK1_TASK_PRIO,
                         (TaskHandle_t*  )&Task1Task_Handler);

      这个时候,我们进行仿真,看看效果如何?

5bb36bda64d06a531932c47cba71ff5d

      我们调用出Logic Analyzer,可以使用软件仿真的形式查看变量的变化情况,明显的看出来flag1和flag2在任务1完成之后,紧跟着完成任务2,以此循环往复的进行着。
       我们也可以进行穿插进行,需要增加手动任务切换函数taskYIELD();在每个任务后面增加这个函数,代码如下,我们重新看一下效果。

voidTask1_Entry(void *p_arg)
{
for(;;)
{
flag1 =1;
delay(100);
flag1=0;
delay(100);
taskYIELD();
}
}

voidTask2_Entry(void *p_arg)
{
for(;;)
{
flag2 =1;
delay(100);
flag2=0;
delay(100);
taskYIELD();
}
}

d537f503859d3de229a4c35cf9de7075

八、实时任务的体现

      我们可以看见flag1的上升沿和flag2的上升沿不是在同一时间,这部分就要创建空闲任务,再通过vTaskDelay()函数实现阻塞延迟的操作。

02b3f621d9eba8ebb7c8adda6280bef7

       这里不再赘述了,一起学习一起研究。

结:

       任何的操作系统都是工具,只是减少基础代码的编写,上层的逻辑代码的实现,还是无法节省的,而FreeRTOS只是将程序员的底层工作简化,更加专注于逻辑功能方面的实现。


fad83e202ee0830a774c9fe526969741
e7e658cab8561a90e929a07771440a3b

打赏榜单

21小跑堂 打赏了 35.00 元 2023-09-26
理由:恭喜通过原创审核!期待您更多的原创作品~

评论

手把手开始第一次FreeRTOS 的应用,整体过程详细,适合小白上手实操。  发表于 2023-9-26 10:00
 楼主| 单片小菜 发表于 2023-9-26 10:56 | 显示全部楼层
感谢
MessageRing 发表于 2023-9-30 20:27 | 显示全部楼层
看着好像不太难
tpgf 发表于 2023-10-21 11:50 | 显示全部楼层
现在我们能使用的国产的系统都有哪些呢
xiaoqizi 发表于 2023-10-21 13:10 | 显示全部楼层
FreeRTOS是一个迷你的实时操作系统内核
八层楼 发表于 2023-10-21 13:46 | 显示全部楼层
功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要
keaibukelian 发表于 2023-10-21 20:23 | 显示全部楼层
FreeRTOS采用双向链表而不是采用查任务就绪表的方法来进行任务调度
wowu 发表于 2023-10-21 21:00 | 显示全部楼层
该系统对单片机配置的最低要求是什么
paotangsan 发表于 2023-10-21 21:30 | 显示全部楼层
相对μC/OS-II、embOS等商业操作系统,FreeRTOS操作系统是完全免费的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到各种单片机上运行
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:资深专家
简介:丰富的嵌入式软硬件开发管理经验; 丰富的项目管理经验并具备敏锐的市场嗅觉; 丰富的产品的供应链资源及工厂管控能力; 具备很强的产品落地经验(从产品企划到产品量产);

107

主题

2352

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部
认证:资深专家
简介:丰富的嵌入式软硬件开发管理经验; 丰富的项目管理经验并具备敏锐的市场嗅觉; 丰富的产品的供应链资源及工厂管控能力; 具备很强的产品落地经验(从产品企划到产品量产);

107

主题

2352

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部