编译环境IAR8.32,
FreeRTOS版本202112.00
芯片系列STM32F103
- 下载源码
在FreeRTOS官网www.freertos.org下载源码V202112.00
也可
这里有不同版本,不过是老的版本
下载的文件目录结构如下(其他的DEMO和plus不介绍)
2FreeRTOS文件整理
由于下载的文件包含很多信息,这里就开发环境和信息提取必要的文件
2.1必须的源文件
做为最小系统必须包含如下文件:
FreeRTOS/Source/tasks.c
FreeRTOS/Source/queue.c
FreeRTOS/Source/list.c
FreeRTOS/Source/portable/[compiler]/[architecture]/port.c.
FreeRTOS/Source/portable/MemMang/heap_x.c where 'x' is 1, 2, 3, 4 or 5.
由于我用的是STM32F103 ARM_CM3
2.2其他功能C文件
FreeRTOS/Source/timers.c 如果需要软定时器功能,增加
FreeRTOS/Source/event_groups.c .事件组功能
FreeRTOS/Source/stream_buffer.c 如果需要流缓冲区或消息缓冲区功能.
FreeRTOS/Source/croutine.c 如果您需要协同例程功能 本功能已经弃用
2.3头文件
FreeRTOS/Source/include
FreeRTOS/Source/portable/[compiler]/[architecture].
Whichever directory contains the FreeRTOSConfig.h file to be used - see the Configuration File paragraph below.
Depending on the port, it may also be necessary for the same directories to be in the assembler's include path.
最终建立目录FreeRTOS/includes和FreeRTOS/source(当然也可按照功能多建立几个文件,反正这些文件我们不需要修改为了系统加载方便就按照.c和.h分类,.c .s放source中.h放includes中)
Source/portable/IAR/ARM_CM3下所有文件
Source/portable/MemMang
在source目录下的文件
include中的全部文件
增加系统配置文件FreeRTOSConfig.h FreeRTOS根目录下,由于这个文件根据实际情况可能需要修改,所以并不放includes中,这个文件在source目录下并没有需要到DEMO系统中查找。FreeRTOSv202112.00\FreeRTOS\Demo\CORTEX_STM32F103_IAR在这个目录下
这样所有FreeRTOS文件就准备完成
FreeRTOS文件夹下
3、工程中加载,配置
3.1建立FreeRTOSgroup,加载source中所有文件
3.2增加配置头文件路径$PROJ_DIR$\FreeRTOS\includes
3.3增加FreeRTOSConfig.h路径$PROJ_DIR$
这个时候可以编译一下,应该不会报错
上面的文件不是所有文件必须加载的,可以按照最小系统加载,下面我们就建立两个简单的任务并运行调试
4、修改启动文件
由于FreeRTOS下面三个中断函数FreeRTOS系统已经写好了,我们需要将他链接过去
在启动文件中startup_stm32f10x_md.s修改,这个文件由芯片型号决定
SVC_Handler替换成vPortSVCHandler
PendSV_Handler提换成xPortPendSVHandler,
SysTickHandler替换成xPortSysTickHandler,
5、增加任务文件
Main.c中增加
头文件
#incldue "FreeRTOS.h"
#incldue "task.h"
mian()中增加启动任务代码
/* Set the Vector Table base address at 0x08000000 */
NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0 );
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
/* Configure HCLK clock as SysTick clock source. */
SysTick_CLKSourceConfig( SysTick_CLKSource_HCLK );
xTaskCreate( led0_task, "LED0", configMINIMAL_STACK_SIZE, NULL, 9, NULL );
xTaskCreate( led1_task, "LED1", configMINIMAL_STACK_SIZE, NULL,10, NULL );
/* Configure the timers used by the fast interrupt timer test. */
/* Start the scheduler. */
vTaskStartScheduler();
//LED0任务
void led0_task(void *pdata)
{
while(1)
{
LED1(0);;
// delay_ms(80);
LED1(1);;
// delay_ms(920);
};
}
LED1任务
void led1_task(void *pdata)
{
while(1)
{
LED2(0);;
// delay_ms(300);
LED2(1);;
// delay_ms(300);
};
}
这时候再编一下运行就可以看效果了
注意上面的延时必须注释掉,否则会有问题,因延时程序是用定时器做的。
至于现象运行是看不到,通过运行到光标功能来看是程序在两个任务中切换