之前一直使用UCOSII做嵌入式开发,但在资源较小的M3上就显得无能为力了,但是在rtos上编写程序后就再不想回到裸奔的时代,之前这种情况一直使用的是《时间触发的嵌入式操作系统》书中提供的调度器,很好用也很实用,但缺少通信手段,于是就做了rtos的移植,如果觉得rtos也比较大的话,那建议使用之前提供的调度器做开发,移植参考了网友移植,网址如下:
http://cnskyline.tech/2016/10/01/stm32-1/
我手头只有stm32F103c8t6,就以他为平台进行移植,其实对于M3的芯片,移植工作都很简单,比我当时自己移植UCOSII到arm7方便多了。
移植环境:
MDK5.20
FreeRTOS9.0.0
STM32F10X_StdPeriph_Lib_V3.5.0
将解压后的FreeRTOS9.0.0文件夹中的FreeRTOS/Source文件夹复制到stm32F103c8t6的工程文件下(如FreeRTOS目录下),将文件夹中\FreeRTOS\Demo\CORTEX_STM32F103_Keil路径下FreeRTOSConfig.h拷贝到工程文件夹FreeRTOS中。打开MDK,添加如下文件
“port.c”文件路径..\FreeRTOS\Source\portable\RVDS\ARM_CM3
“heap_2.c”文件路径..\FreeRTOS\Source\portable\MemMang
“list.c”、“queue.c”、“tasks.c”文件路径..\FreeRTOS\Source
添加头文件:
..\FreeRTOS\Source\portable\RVDS\ARM_CM3
..\FreeRTOS
..\FreeRTOS\Source\include
修改启动文件,这里如果移植过UCOS的话,应该超级简单:
将SVC_Handler PendSV_Handler SysTick_Handler 分别替换为 vPortSVCHandler xPortPendSVHandler xPortSysTickHandler 如下:
; DCD SVC_Handler ; SVCall Handler
DCD vPortSVCHandler ; SVCall Handler
; DCD PendSV_Handler ; PendSV Handler
; DCD SysTick_Handler ; SysTick Handler
DCD xPortPendSVHandler ; PendSV Handler
DCD xPortSysTickHandler ; SysTick Handler
并在如下位置增加函数申明:
基本就一直完成,现在在main函数中创建任务,盗用网友的程序如下:
void LED0_Task(void * pvParameters);
void LED1_Task(void * pvParameters);
int main(void)
{
LED_Init();
xTaskCreate(LED0_Task, (const char *)"LED0", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 3, NULL);
xTaskCreate(LED1_Task, (const char *)"LED1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 4, NULL);
vTaskStartScheduler();
}
void LED0_Task(void * pvParameters)
{
while (1)
{
LED0 = !LED0;vTaskDelay(800 / portTICK_RATE_MS);
}
}
void LED1_Task(void * pvParameters)
{
while (1)
{
LED1 = !LED1;vTaskDelay(500 / portTICK_RATE_MS);
}
}
到此移植结束,程序应该能正常运行了。