准备工作
- 下载 FreeRTOSv9.0.0 源码
- STM32F1相关环境和文件
创建工程
-
创建stm32f1工程
新建文件夹 FreeRTOS并将 FreeRTOSv9.0.0\surce\的所有文件复制到 FreeRTOS下,
将 G:\7-FreeRTOS资料\FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil 下的FreeRTOSConfig.h 复制到 FreeRTOS\include 下;-
在工程里创建一个文件夹FreeRTOS,
并导入 FreeRTOSv9.0.0\surce的croutine.c, timers.c, list.c, queue.c, tasks.c,FreeRTOSv9.0.0\FreeRTOS\Source\portable\RVDS\ARM_CM3 下的port.h
FreeRTOSv9.0.0\FreeRTOS\Source\portable\MemMang 下的heap_2.h导入。
-
修改工程路径
修改启动文件 startup_stm32f10x_hd.s 在Cortex-M3硬件下,FreeRTOS使用SysTick作为系统节拍时钟,使用SVC和PendSVC进行上下文切换。异常中断服务代码位于port.c文件中,FreeRTOS的作者已经为各种架构的CPU写好了这些代码,可以直接拿来用,需要用户做的,仅仅是将这些异常中断入口地址挂接到启动代码中。
在__heap_limit下面添加:
PRESERVE8
THUMB
IMPORT xPortPendSVHandler
IMPORT xPortSysTickHandler
IMPORT vPortSVCHandler
找到DCD SVC_Handler 将其屏蔽掉,改成DCD vPortSVCHandler。找到DCD PendSV_Handler将其屏蔽掉,改成DCD xPortPendSVHandler。找到DCD SysTick_Handler将其屏蔽掉,改成DCD xPortSysTickHandler。
DCD vPortSVCHandler ;DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ;Debug Monitor Handler
DCD xPortPendSVHandler ;DCD PendSV_Handler ; PendSV Handler
DCD xPortSysTickHandler ;DCD SysTick_Handler ; SysTick Handler
- 配置基本完成,下面写主函数 测试;
#include "stm32f10x.h"
#include "bsp_led.h"
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
void vTaskLed1( void * pvParameters )
{
while(1)
{
macLED1_ON (); // ÁÁ
vTaskDelay( 5000 );
macLED1_OFF (); // Ãð
vTaskDelay( 5000 );
}
}
void vTaskLed2( void * pvParameters )
{
while(1)
{
macLED2_ON (); // ÁÁ
vTaskDelay( 5000 );
macLED2_OFF (); // Ãð
vTaskDelay( 5000 );
}
}
void vTaskLed3( void * pvParameters )
{
while(1)
{
macLED3_ON (); // ÁÁ
vTaskDelay( 5000 );
macLED3_OFF (); // Ãð
vTaskDelay( 5000 );
}
}
void vTaskStart( void * pvParameters )
{
LED_Init (); //³õʼ»¯ LED
xTaskCreate( vTaskLed1, "Task Led1", 512, NULL, 1, NULL );
xTaskCreate( vTaskLed2, "Task Led2", 512, NULL, 1, NULL );
xTaskCreate( vTaskLed3, "Task Led3", 512, NULL, 1, NULL );
vTaskDelete( NULL );
}
/**
* @brief Ö÷º¯Êý
* @param ÎÞ
* @retval ÎÞ
*/
int main ( void )
{
xTaskCreate( vTaskStart, "Task Start", 512, NULL, 1, NULL );
vTaskStartScheduler();
}
具体可自行修改main函数,只要添加相应的头文件即可
下载运行