1.下载源码
下载FreeRTOSv9.0.0.zip解压如下图
只用关注第一个文件夹FreeRTOS中的内容
Demo是官方提供的常见芯片的移植示例,包括STM32F103,我们需要用到其中的FreeRTOSConfig.h配置文件。
Source是源文件。
2.拷贝源码
在工程目录下创建FreeRTOS文件夹并创建子文件夹src和port
将Source/include文件夹拷贝到FreeRTOS下
将Source中的C文件拷贝到FreeRTOS/src下
将Source/portable下的MemMang和RVDS文件夹拷贝到FreeRTOS/port下,
其中MemMang下的源文件是用于堆栈管理的,RVDS下的源文件是不同内核相关的接口文件。
3.添加到工程
新建FreeRTOS/src和FreeRTOS/port组
FreeRTOS/src组中把FreeRTOS/src文件夹中的源文件全部添加
FreeRTOS/port组添加FreeRTOS\port\MemMang中的heap4.c和
FreeRTOS\port\RVDS\ARM_CM3中的port.c
添加头文件路径
拷贝FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil下的FreeRTOSConfig.h文件到工程
4.修改配置
在FreeRTOSConfig.h中添加
- #define xPortPendSVHandler PendSV_Handler
- #define vPortSVCHandler SVC_Handler
复制代码
在stm32f10x_it.c中屏蔽PendSV_Handler和SVC_Handler中断
最关键的一部,修改stm32f10x_it.c中的systick中断服务函数。
- /**
- * @brief This function handles SysTick Handler.
- * @param None
- * @retval None
- */
- extern void xPortSysTickHandler(void);
- void SysTick_Handler(void)
- {
- #if (INCLUDE_xTaskGetSchedulerState == 1 )
- if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
- {
- #endif /* INCLUDE_xTaskGetSchedulerState */
- xPortSysTickHandler();
- #if (INCLUDE_xTaskGetSchedulerState == 1 )
- }
- #endif /* INCLUDE_xTaskGetSchedulerState */
- }
复制代码
5.验证demo
- #include "stm32f10x.h"
- #include "FreeRTOS.h"
- #include "task.h"
- #include "portmacro.h"
- #include "bsp_led.h"
- #include "log.h"
- static TaskHandle_t led_task_handle = NULL;
- void led_task(void *arg)
- {
- while(1)
- {
- led_status_set(LED_STATUS_ON);
- LOG_DEBUG("LED_STATUS_ON\r\n");
- vTaskDelay(500/portTICK_PERIOD_MS);
- led_status_set(LED_STATUS_OFF);
- LOG_DEBUG("LED_STATUS_OFF\r\n");
- vTaskDelay(500/portTICK_PERIOD_MS);
- }
- }
- int main(void)
- {
- led_init();
- xTaskCreate(led_task, "led_task", 1024, NULL, 20, led_task_handle);
- // 开启调度
- vTaskStartScheduler();
- while(1);
- }
复制代码
6.完整工程
————————————————
版权声明:无聊到发博客的菜鸟
如有侵权请联系删除
|