赞
踩
freertos是轻量级,简单、免费、开源的RTOS
源码仓库地址 https://gitee.com/free-rtos_1/FreeRTOS.git
本次移植代码标签为V9.0.0的节点, 移植到STM32F103VET6
基础工程由 cubemx 生成,配置项:
配置一路串口,用来打印日志。
配置系统时钟为72MHZ。
配置滴答时钟,1ms周期。
创建OsCore文件夹,用来存放系统核心源码
创建OsApp文件夹,用来存放系统初始化,用户任务创建,系统配置等文件
从git仓库下载下来是这样的,如下图所示:
Demo:测试验证的demo源码。
将 Demo\CORTEX_STM32F103_Keil 中的如下两个文件拷贝到工程目录下OsApp,main.c重命名为rtos_main.c
License:暂不关心。
Source:系统核心源码,重点关注,如下图所示:
Source\include: 核心源码的头文件 ,如下图所示:
Source\portable: 不同平台对应的底层操作源码,重点关注下图圈住文件夹
MemMang\*.c 内存管理相关代码,这里包含五种管理方案,我们选择heap_4.c
,注意添加工程时只需要添加一种。
RVDS\ARM_CM3 根据不同平台选择不同文件,本次移植到STM32F103,所以选择M3
将 Source 中的文件拷贝到工程目录下OsCore下(绿框圈住的的全部拷贝)
portable 根据不同平台选择性拷贝,STM32F104VET6 只需要拷贝 RVDS\ARM_CM3和MemMang中heap_4.c文件。
拷贝后完整结果如下图所示
修改FreeRTOSConfig.h中 系统时钟72MHZ,滴答时钟频率1000HZ,总堆大小17KB
将上述文件,加入到keil工程中,编译。
将 xPortPendSVHandler 接口在系统悬起中断函数中调用,如下图所示:
将 xPortSysTickHandler 接口在系统滴答时钟函数中调用,如下图所示:
将vPortSVCHandler 接口在系统服务中断函数中调用,如下图所示:
rtos_main.c创建如下测试任务
- /*-----------------------------------------------------------*/
- void vLED1Task( void *pvParameters )
- {
- static GPIO_PinState PinState = GPIO_PIN_SET;
- while(1)
- {
- PinState = (PinState == GPIO_PIN_SET ? GPIO_PIN_RESET : GPIO_PIN_SET);
- HAL_GPIO_WritePin(GPIOD, PIN_LED1_Pin, PinState);
- vTaskDelay(100);
- }
- }
-
- void vLED2Task( void *pvParameters )
- {
- static GPIO_PinState PinState = GPIO_PIN_SET;
- while(1)
- {
- PinState = (PinState == GPIO_PIN_SET ? GPIO_PIN_RESET : GPIO_PIN_SET);
- HAL_GPIO_WritePin(GPIOD, PIN_LED2_Pin, PinState);
- vTaskDelay(100);
- }
- }
-
- int rtos_main( void )
- {
- #ifdef DEBUG
- debug();
- #endif
-
-
- xTaskCreate( vLED1Task, "LED1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
- xTaskCreate( vLED2Task, "LED2", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
-
-
- /* Start the scheduler. */
- vTaskStartScheduler();
-
- /* Will only get here if there was not enough heap space to create the
- idle task. */
- return 0;
- }
编译通过后,下载到板子,闪灯,正常运行。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。