当前位置:   article > 正文

STM32F103-基于正点原子的 FreeRTOS 移植(完整教程)附测试代码_stm32f103 freertos

stm32f103 freertos

前言

        在看正点原子的FreeRTOS开发手册移植的时候,发现开发手册的描述并不全面,有几处遗漏。下面我展示出完整的教程,希望大家在学习的时候能够轻松点。

一、准备工作

1、正点原子的FreeRTOS官方资料

        大家可自行到官方下载,或者在我主页的资料中自行下载;

①:获取FreeRTOS原码

                              

                                                      

        下载好后是一个.exe可执行文件,双击打开后是就是这个界面。中间选择好解压文件的位置,然后点击Extract按键进行解压。

                               

        简单等待一下。。。

                               

        打开解压好的文件就有这些东西,这样大家就获得了FreeRTOS源码!!!

大家如果只是为了移植代码,或者是在移植代码过程中遇到了什么问题,可以直接跳转到下一部分

②:认识FreeRTOS源码

        Demo文件

                      

        打开FreeRTOS文件夹,Demo 文件夹里面是 FreeRTOS 的相关例程。

                          

        其中有不同MCU的不同例程,我们学习的F103就是这些。

        License文件

        这个文件夹里面就是相关的许可信息,要用 FreeRTOS 做产品的得仔细看看。咱们不需要,可以忽略

        Source文件

        里面就是FreeRTOS源码了。

                       

        include 文件夹是一些头文件,移植的时候是需要的;

        下面的 .C  文件是 FreeRTOS 的源码文件,移植的时候是需要的;

        portable 文件夹里面的东西是 FreeRTOS 系统和具体的硬件之间的连接桥梁。不同的编译环境,不同的 MCU,其桥梁应该是不同的

        打开 portable 文件夹,找到这三个文件夹。我们暂时只需要认识这三个就行。

        keil 文件夹:FreeRTOS 针对不同的编译环境和 MCU 都有不同的“桥梁”,我们使用的是 MDK 编译环境下的 STM32F103 ;

        MemMang 文件夹:这个文件夹是跟内存管理相关的, 我们移植的时候是必须的;

        RVDS 文件夹:因为keil 文件中会用到 RVDS 中的东西,所以 RVDS 也是必须的。RVDS 文件夹针对不同的架构的 MCU 做了详细的分类,STM32F103 就参考 ARM_CM3。

                     

        打开 RVDS 文件夹下面的 ARM_CM3 里面这两个文件都是移植所需要的。

③:FreeRTOS-Plus 文件夹

        我们再回到开始,我们会发现还有一个 FreeRTOS-Plus 文件夹,这其实就是在 FreeRTOS 系统上另外增加的一些功能代码,可以不管。

2、STM32F103的基础工程

        相信大家都学到这块了,基础工程总该有吧!!!我们就以最基本的点灯代码为例,毕竟绝大部分入坑嵌入式都是从点灯开始的。

遇到的问题:

        刚开始我一直纠结用寄存器版本的还是标准库版本的还是HAL库版本的。

解决办法:

        标准库函数和HAL库都行,我使用的是标准库的代码。

二、FreeRTOS移植

1、添加 FreeRTOS 源码

        我们先点开准备好的基础工程,在里面添加 FreeRTOS 文件夹,将 FreeRTOS 的源码添加到这个文件夹中;

                       

        将前面说的 FreeRTOS / Source 文件夹下面的全部文件复制到刚刚新建的 FreeRTOS 文件夹中;

                     

        portable 文件夹中我们只需要留下 keil、MemMang 和 RVDS 这三个文件夹,其他的都可以删除掉。这也是为了方便操作;

                    

2、在keil中添加文件

        在 keil 中打开刚刚操作的那个跑马灯工程。然后新建分组 FreeRTOS_CORE 和 FreeRTOS_PORTABLE

                 

        在 FreeRTOS_CORE 中添加这些 .c 文件(点击右下角的Add Files按钮,找到刚刚添加的FreeRTOS文件夹中的 .c 文件)

                  

        在 FreeRTOS_PORTABLE 中添加这些 .c 文件

        port.c 和 heap_4.c 在哪呢?port.c 是 RVDS 文件 夹下的 ARM_CM3 中的文件,因为 STM32F103 是 Cortex-M3 内核的,因此要选择 ARM_CM3 中的 port.c 文件。heap_4.c 是 MemMang 文件夹中的,前面说了 MemMang 是跟内存管理相关的,里面有5个 c 文件:heap_1.c、heap_2.c、heap_3.c、heap_4.c 和 heap_5.c。这 5 个 c 文件是五种不同的内存管理方法。这5个文件都可以用来作为 FreeRTOS 的内存管理文件,只是它们的实现原理不同,各有利弊。这里我们选择 heap_4.c。

                     

        弄完就是这样式儿的:

                        

3、添加相应的头文件路径

        找到添加 .h 文件的地方;

                       

        添加如下文件(方式和添加 .c 文件类似):

                     

        然后我们打开前面说的 Demo 文件,找到CORTEX_STM32F103_Keil文件:

                    

        打开CORTEX_STM32F103_Keil文件后找到FreeRTOSConfig.h文件;

                    

        将其复制到新建的FreeRTOS文件夹的include文件夹下面;

                  

        此时我们代码的移植部分初步结束,编译一下看看。。。0 Error,0 Warning!!!完美!!!

                  

遇到的问题

        只要仔细点,到目前为止,不应该出现任何错误昂。如果有人编译的时候出现错误,那就自己仔细检查检查。

三、修改 SYSTEM 文件

        SYSTEM 文件夹里面的文件一开始是针对 UCOS 而编写的,所以如果使用 FreeRTOS 的话 就需要做相应的修改。

        在修改过程中,注意 #if 与 #endif 。

1、修改 sys.h 文件

        将宏 SYSTEM_SUPPORT_OS 改为 1

2、修改 usart.c 文件

①:添加 FreeRTOS.h 头文件

        将 includes.h 头文件改为 FreeRTOS.h 头文件

②:修改 USART1 的中断服务函数

        将下面的这两个块删掉就行,这两行是UCOS的函数;

3、修改 delay.c 文件

①:SysTick_Handler() 函数

        首先是 SysTick_Handler() 函数:

        将此函数改为如下函数:

  1. extern void xPortSysTickHandler(void);
  2. //systick 中断服务函数,使用 OS 时用到
  3. void SysTick_Handler(void)
  4. {
  5. if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
  6. {
  7. xPortSysTickHandler();
  8. }
  9. }

②:delay_init() 函数

        将 delay_init() 函数改为:

  1. //初始化延迟函数
  2. //SYSTICK 的时钟固定为 AHB 时钟,基础例程里面 SYSTICK 时钟频率为 AHB/8
  3. //这里为了兼容 FreeRTOS,所以将 SYSTICK 的时钟频率改为 AHB 的频率!
  4. //SYSCLK:系统时钟频率
  5. void delay_init()
  6. {
  7. u32 reload;
  8. SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//选择外部时钟 HCLK
  9. fac_us=SystemCoreClock/1000000; //不论是否使用 OS,fac_us 都需要使用
  10. reload=SystemCoreClock/1000000; //每秒钟的计数次数 单位为 M
  11. reload*=1000000/configTICK_RATE_HZ; //根据 configTICK_RATE_HZ 设定溢出
  12. //时间 reload 为 24 位寄存器,最大值:
  13. //16777216,在 72M 下,约合 0.233s 左右
  14. fac_ms=1000/configTICK_RATE_HZ; //代表 OS 可以延时的最少单位
  15. SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; //开启 SYSTICK 中断
  16. SysTick->LOAD=reload; //每 1/configTICK_RATE_HZ 秒中断
  17. //一次
  18. SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启 SYSTICK
  19. }

③:delay_ms、delay_us 函数

        将 void delay_us(u32 nus) 和 void delay_ms(u16 nms) 函数删掉,并修改为如下代码:

  1. //延时 nus
  2. //nus:要延时的 us 数.
  3. //nus:0~204522252(最大值即 2^32/fac_us@fac_us=168)
  4. void delay_us(u32 nus)
  5. {
  6. u32 ticks;
  7. u32 told,tnow,tcnt=0;
  8. u32 reload=SysTick->LOAD; //LOAD 的值
  9. ticks=nus*fac_us; //需要的节拍数
  10. told=SysTick->VAL; //刚进入时的计数器值
  11. while(1)
  12. {
  13. tnow=SysTick->VAL;
  14. if(tnow!=told)
  15. {
  16. //这里注意一下 SYSTICK 是一个递减的计数器就可以了.
  17. if(tnow<told)tcnt+=told-tnow;
  18. else tcnt+=reload-tnow+told;
  19. told=tnow;
  20. if(tcnt>=ticks)break; //时间超过/等于要延迟的时间,则退出.
  21. }
  22. };
  23. }
  24. //延时 nms,会引起任务调度
  25. //nms:要延时的 ms 数
  26. //nms:0~65535
  27. void delay_ms(u32 nms)
  28. {
  29. if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
  30. {
  31. if(nms>=fac_ms) //延时的时间大于 OS 的最少时间周期
  32. {
  33. vTaskDelay(nms/fac_ms); //FreeRTOS 延时
  34. }
  35. nms%=fac_ms; //OS 已经无法提供这么小的延时了,
  36. //采用普通方式延时
  37. }
  38. delay_us((u32)(nms*1000)); //普通方式延时
  39. }
  40. //延时 nms,不会引起任务调度
  41. //nms:要延时的 ms 数
  42. void delay_xms(u32 nms)
  43. {
  44. u32 i;
  45. for(i=0;i<nms;i++) delay_us(1000);
  46. }

④:修改头文件

        将 includes.h 头文件改为 FreeRTOS.h 头文件,并包含 task.h 文件:

⑤:删掉无用函数

        void delay_osschedlock(void);

        void delay_osschedunlock(void);

        void delay_ostimedly(u32 ticks);

4、修改 stm32f10x_it.c 文件

        在 port.c、delay.c 和 stm32f10x_it.c 中三个重复定义的函数: SysTick_Handler()、SVC_Handler()和 PendSV_Handler(),这三个函数分别为滴答定时器中断服务函数、SVC 中断服务函数和 PendSV 中断服务函数,将 stm32f10x_it.c 中的三个函数屏蔽掉:

              

        双击 stm32f10x_it.c 文件,屏蔽这三个函数:

                  

遇到的问题

        1、..\SYSTEM\delay\delay.c(140): error:  #147-D: declaration is incompatible with "void delay_ms(u16)" (declared at line 44 of "..\SYSTEM\delay\delay.h")

        2、..\OBJ\LED.axf: Error: L6218E: Undefined symbol xTaskGetSchedulerState (referred from delay.o).

解决办法

1、在 delay.h 中将 void delay_ms(u16 nms); 改为 void delay_ms(u32 nms);

2、在 FreeRTOS.h 中将 #define INCLUDE_xTaskGetSchedulerState 0 改为 #define INCLUDE_xTaskGetSchedulerState 1

        如果此时你的代码还是不能运行,可能是你的 FreeRTOSConfig.h 文件复制错误了,将 FreeRTOSConfig.h 文件换成如下代码:

  1. /*
  2. FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd.
  3. All rights reserved
  4. VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
  5. This file is part of the FreeRTOS distribution.
  6. FreeRTOS is free software; you can redistribute it and/or modify it under
  7. the terms of the GNU General Public License (version 2) as published by the
  8. Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.
  9. ***************************************************************************
  10. >>! NOTE: The modification to the GPL is included to allow you to !<<
  11. >>! distribute a combined work that includes FreeRTOS without being !<<
  12. >>! obliged to provide the source code for proprietary components !<<
  13. >>! outside of the FreeRTOS kernel. !<<
  14. ***************************************************************************
  15. FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
  16. WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  17. FOR A PARTICULAR PURPOSE. Full license text is available on the following
  18. link: http://www.freertos.org/a00114.html
  19. ***************************************************************************
  20. * *
  21. * FreeRTOS provides completely free yet professionally developed, *
  22. * robust, strictly quality controlled, supported, and cross *
  23. * platform software that is more than just the market leader, it *
  24. * is the industry's de facto standard. *
  25. * *
  26. * Help yourself get started quickly while simultaneously helping *
  27. * to support the FreeRTOS project by purchasing a FreeRTOS *
  28. * tutorial book, reference manual, or both: *
  29. * http://www.FreeRTOS.org/Documentation *
  30. * *
  31. ***************************************************************************
  32. http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
  33. the FAQ page "My application does not run, what could be wrong?". Have you
  34. defined configASSERT()?
  35. http://www.FreeRTOS.org/support - In return for receiving this top quality
  36. embedded software for free we request you assist our global community by
  37. participating in the support forum.
  38. http://www.FreeRTOS.org/training - Investing in training allows your team to
  39. be as productive as possible as early as possible. Now you can receive
  40. FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
  41. Ltd, and the world's leading authority on the world's leading RTOS.
  42. http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
  43. including FreeRTOS+Trace - an indispensable productivity tool, a DOS
  44. compatible FAT file system, and our tiny thread aware UDP/IP stack.
  45. http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
  46. Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
  47. http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
  48. Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
  49. licenses offer ticketed support, indemnification and commercial middleware.
  50. http://www.SafeRTOS.com - High Integrity Systems also provide a safety
  51. engineered and independently SIL3 certified version for use in safety and
  52. mission critical applications that require provable dependability.
  53. 1 tab == 4 spaces!
  54. */
  55. #ifndef FREERTOS_CONFIG_H
  56. #define FREERTOS_CONFIG_H
  57. #include "sys.h"
  58. #include "usart.h"
  59. //针对不同的编译器调用不同的stdint.h文件
  60. #if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
  61. #include <stdint.h>
  62. extern uint32_t SystemCoreClock;
  63. #endif
  64. //断言
  65. #define vAssertCalled(char,int) printf("Error:%s,%d\r\n",char,int)
  66. #define configASSERT(x) if((x)==0) vAssertCalled(__FILE__,__LINE__)
  67. /***************************************************************************************************************/
  68. /* FreeRTOS基础配置配置选项 */
  69. /***************************************************************************************************************/
  70. #define configUSE_PREEMPTION 1 //1使用抢占式内核,0使用协程
  71. #define configUSE_TIME_SLICING 1 //1使能时间片调度(默认式使能的)
  72. #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 //1启用特殊方法来选择下一个要运行的任务
  73. //一般是硬件计算前导零指令,如果所使用的
  74. //MCU没有这些硬件指令的话此宏应该设置为0!
  75. #define configUSE_TICKLESS_IDLE 0 //1启用低功耗tickless模式
  76. #define configUSE_QUEUE_SETS 1 //为1时启用队列
  77. #define configCPU_CLOCK_HZ (SystemCoreClock) //CPU频率
  78. #define configTICK_RATE_HZ (1000) //时钟节拍频率,这里设置为1000,周期就是1ms
  79. #define configMAX_PRIORITIES (32) //可使用的最大优先级
  80. #define configMINIMAL_STACK_SIZE ((unsigned short)130) //空闲任务使用的堆栈大小
  81. #define configMAX_TASK_NAME_LEN (16) //任务名字字符串长度
  82. #define configUSE_16_BIT_TICKS 0 //系统节拍计数器变量数据类型,
  83. //1表示为16位无符号整形,0表示为32位无符号整形
  84. #define configIDLE_SHOULD_YIELD 1 //为1时空闲任务放弃CPU使用权给其他同优先级的用户任务
  85. #define configUSE_TASK_NOTIFICATIONS 1 //为1时开启任务通知功能,默认开启
  86. #define configUSE_MUTEXES 1 //为1时使用互斥信号量
  87. #define configQUEUE_REGISTRY_SIZE 8 //不为0时表示启用队列记录,具体的值是可以
  88. //记录的队列和信号量最大数目。
  89. #define configCHECK_FOR_STACK_OVERFLOW 0 //大于0时启用堆栈溢出检测功能,如果使用此功能
  90. //用户必须提供一个栈溢出钩子函数,如果使用的话
  91. //此值可以为1或者2,因为有两种栈溢出检测方法。
  92. #define configUSE_RECURSIVE_MUTEXES 1 //为1时使用递归互斥信号量
  93. #define configUSE_MALLOC_FAILED_HOOK 0 //1使用内存申请失败钩子函数
  94. #define configUSE_APPLICATION_TASK_TAG 0
  95. #define configUSE_COUNTING_SEMAPHORES 1 //为1时使用计数信号量
  96. /***************************************************************************************************************/
  97. /* FreeRTOS与内存申请有关配置选项 */
  98. /***************************************************************************************************************/
  99. #define configSUPPORT_DYNAMIC_ALLOCATION 1 //支持动态内存申请
  100. #define configTOTAL_HEAP_SIZE ((size_t)(20*1024)) //系统所有总的堆大小
  101. /***************************************************************************************************************/
  102. /* FreeRTOS与钩子函数有关的配置选项 */
  103. /***************************************************************************************************************/
  104. #define configUSE_IDLE_HOOK 0 //1,使用空闲钩子;0,不使用
  105. #define configUSE_TICK_HOOK 0 //1,使用时间片钩子;0,不使用
  106. /***************************************************************************************************************/
  107. /* FreeRTOS与运行时间和任务状态收集有关的配置选项 */
  108. /***************************************************************************************************************/
  109. #define configGENERATE_RUN_TIME_STATS 0 //为1时启用运行时间统计功能
  110. #define configUSE_TRACE_FACILITY 1 //为1启用可视化跟踪调试
  111. #define configUSE_STATS_FORMATTING_FUNCTIONS 1 //与宏configUSE_TRACE_FACILITY同时为1时会编译下面3个函数
  112. //prvWriteNameToBuffer(),vTaskList(),
  113. //vTaskGetRunTimeStats()
  114. /***************************************************************************************************************/
  115. /* FreeRTOS与协程有关的配置选项 */
  116. /***************************************************************************************************************/
  117. #define configUSE_CO_ROUTINES 0 //为1时启用协程,启用协程以后必须添加文件croutine.c
  118. #define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) //协程的有效优先级数目
  119. /***************************************************************************************************************/
  120. /* FreeRTOS与软件定时器有关的配置选项 */
  121. /***************************************************************************************************************/
  122. #define configUSE_TIMERS 1 //为1时启用软件定时器
  123. #define configTIMER_TASK_PRIORITY (configMAX_PRIORITIES-1) //软件定时器优先级
  124. #define configTIMER_QUEUE_LENGTH 5 //软件定时器队列长度
  125. #define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE*2) //软件定时器任务堆栈大小
  126. /***************************************************************************************************************/
  127. /* FreeRTOS可选函数配置选项 */
  128. /***************************************************************************************************************/
  129. #define INCLUDE_xTaskGetSchedulerState 1
  130. #define INCLUDE_vTaskPrioritySet 1
  131. #define INCLUDE_uxTaskPriorityGet 1
  132. #define INCLUDE_vTaskDelete 1
  133. #define INCLUDE_vTaskCleanUpResources 1
  134. #define INCLUDE_vTaskSuspend 1
  135. #define INCLUDE_vTaskDelayUntil 1
  136. #define INCLUDE_vTaskDelay 1
  137. #define INCLUDE_eTaskGetState 1
  138. #define INCLUDE_xTimerPendFunctionCall 1
  139. /***************************************************************************************************************/
  140. /* FreeRTOS与中断有关的配置选项 */
  141. /***************************************************************************************************************/
  142. #ifdef __NVIC_PRIO_BITS
  143. #define configPRIO_BITS __NVIC_PRIO_BITS
  144. #else
  145. #define configPRIO_BITS 4
  146. #endif
  147. #define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15 //中断最低优先级
  148. #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5 //系统可管理的最高中断优先级
  149. #define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
  150. #define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
  151. /***************************************************************************************************************/
  152. /* FreeRTOS与中断服务函数有关的配置选项 */
  153. /***************************************************************************************************************/
  154. #define xPortPendSVHandler PendSV_Handler
  155. #define vPortSVCHandler SVC_Handler
  156. #endif /* FREERTOS_CONFIG_H */

四、测试例程

        用该代码替换 main.c 代码即可

  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "FreeRTOS.h"
  6. #include "task.h"
  7. /************************************************
  8. ALIENTEK 战舰STM32F103开发板 FreeRTOS实验2-1
  9. FreeRTOS移植实验-库函数版本
  10. 技术支持:www.openedv.com
  11. 淘宝店铺:http://eboard.taobao.com
  12. 关注微信公众平台微信号:"正点原子",免费获取STM32资料。
  13. 广州市星翼电子科技有限公司
  14. 作者:正点原子 @ALIENTEK
  15. ************************************************/
  16. //任务优先级
  17. #define START_TASK_PRIO 1
  18. //任务堆栈大小
  19. #define START_STK_SIZE 128
  20. //任务句柄
  21. TaskHandle_t StartTask_Handler;
  22. //任务函数
  23. void start_task(void *pvParameters);
  24. //任务优先级
  25. #define LED0_TASK_PRIO 2
  26. //任务堆栈大小
  27. #define LED0_STK_SIZE 50
  28. //任务句柄
  29. TaskHandle_t LED0Task_Handler;
  30. //任务函数
  31. void led0_task(void *pvParameters);
  32. //任务优先级
  33. #define LED1_TASK_PRIO 3
  34. //任务堆栈大小
  35. #define LED1_STK_SIZE 50
  36. //任务句柄
  37. TaskHandle_t LED1Task_Handler;
  38. //任务函数
  39. void led1_task(void *pvParameters);
  40. int main(void)
  41. {
  42. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
  43. delay_init(); //延时函数初始化
  44. uart_init(115200); //初始化串口
  45. LED_Init(); //初始化LED
  46. //创建开始任务
  47. xTaskCreate((TaskFunction_t )start_task, //任务函数
  48. (const char* )"start_task", //任务名称
  49. (uint16_t )START_STK_SIZE, //任务堆栈大小
  50. (void* )NULL, //传递给任务函数的参数
  51. (UBaseType_t )START_TASK_PRIO, //任务优先级
  52. (TaskHandle_t* )&StartTask_Handler); //任务句柄
  53. vTaskStartScheduler(); //开启任务调度
  54. }
  55. //开始任务任务函数
  56. void start_task(void *pvParameters)
  57. {
  58. taskENTER_CRITICAL(); //进入临界区
  59. //创建LED0任务
  60. xTaskCreate((TaskFunction_t )led0_task,
  61. (const char* )"led0_task",
  62. (uint16_t )LED0_STK_SIZE,
  63. (void* )NULL,
  64. (UBaseType_t )LED0_TASK_PRIO,
  65. (TaskHandle_t* )&LED0Task_Handler);
  66. //创建LED1任务
  67. xTaskCreate((TaskFunction_t )led1_task,
  68. (const char* )"led1_task",
  69. (uint16_t )LED1_STK_SIZE,
  70. (void* )NULL,
  71. (UBaseType_t )LED1_TASK_PRIO,
  72. (TaskHandle_t* )&LED1Task_Handler);
  73. vTaskDelete(StartTask_Handler); //删除开始任务
  74. taskEXIT_CRITICAL(); //退出临界区
  75. }
  76. //LED0任务函数
  77. void led0_task(void *pvParameters)
  78. {
  79. static float float_num=0.01;
  80. while(1)
  81. {
  82. float_num+=0.01f;
  83. taskENTER_CRITICAL(); //进入临界区
  84. printf("float_num的值为: %.4f\r\n",float_num); /*串口打印结果*/
  85. taskEXIT_CRITICAL(); //退出临界区
  86. vTaskDelay(1000);
  87. }
  88. }
  89. //LED1任务函数
  90. void led1_task(void *pvParameters)
  91. {
  92. while(1)
  93. {
  94. LED1=0;
  95. vTaskDelay(200);
  96. LED1=1;
  97. vTaskDelay(800);
  98. }
  99. }

        至此,基于STM32F103的FreeRTOS移植就算完成了。学海无涯,大家一起加油!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/840203
推荐阅读
相关标签
  

闽ICP备14008679号