FreeRTOS之移植篇

编译环境IAR8.32,

FreeRTOS版本202112.00

芯片系列STM32F103

  1. 下载源码

在FreeRTOS官网www.freertos.org下载源码V202112.00

也可

FreeRTOS Real Time Kernel (RTOS) - Browse /FreeRTOS at SourceForge.netMarket leading real time kernel for 40+ microcontroller architectureshttps://sourceforge.net/projects/freertos/files/FreeRTOS/

这里有不同版本,不过是老的版本

下载的文件目录结构如下(其他的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);
    };
}

这时候再编一下运行就可以看效果了

注意上面的延时必须注释掉,否则会有问题,因延时程序是用定时器做的。

至于现象运行是看不到,通过运行到光标功能来看是程序在两个任务中切换

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值