RTOS:Real-time operation system 实时操作系统
比如UCOS,FreeRTOS,RTX,RT-Thread 等这些都是RTOS类操作系统 。
为什么使用操作系统?
通常裸机会使用中断去处理优先级高的函数,但是中断是一瞬间的事情,不能处理太多函数。
引入操作系统,就是加入任务调度,可以更充分更合理利用CPU,能够应对更多复杂的场合。
为什么是FreeRTOS?
文件数量少,文档相对齐全。用的厂商多,社会占有量高。
获取源码
官网FreeRTOS下载
Source里面是真正的源码,Demo官方演示例程,里面有配置文件。
source:
include:包含了FreeRTOS的头文件
portable:包含了FreeRTOS的移植文件
portable文件夹里面的东西就是连接桥梁 由于我们使用MDK开发,因此这里只需要其中的三个移植文件,其他可以删掉。
portable:
只保留这三个文件:
开始移植
开发板选择探索者STM32F407ZG。,使用正点原子例程37内存管理实验
1.将FreeRTOS源码添加至基础工程、头文件路径等
新建FreeRTOS文件夹
将source中的源码添加到该文件夹, 删除.gitmodules
打开工程,添加两个分组:
对每个分组添加相应的代码:
将source中的.c文件添加到FreeRTOS_CORE组
port.c文件在FreeRTOS\portable\RVDS\ARM_CM4F(根据开发板选择相应的port.c)
heap_4.c文件在FreeRTOS\portable\MemMang
添加头文件:
添加FreeRTOSConfig.h 配置文件
个人觉得从官方例程中直接拿来用最方便,当然也可以从demo\CORTEX_M4F_STM32F407ZG-SK获取。
下面是正点原子移植好的,可以直接拿来用:
最后是修改一些SYSTEM系统文件。sys.c、delay.c 、usart.c.
首先是sys.h
Usart.c需要改两个地方
找到中断控制函数
删除上面部分
删除头文件
Delay.c需要删除1个全局变量,6个宏定义,3个函数
从38行一直到98行全部删除
添加外部声明并修改滴答定时器中断服务函数
修改delay_init()函数
void delay_init(u8 SYSCLK)
{
u32 reload;
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
fac_us=SYSCLK; //²»ÂÛÊÇ·ñʹÓÃOS,fac_us¶¼ÐèҪʹÓÃ
reload=SYSCLK; //ÿÃëÖӵļÆÊý´ÎÊý µ¥Î»ÎªM
reload*=1000000/configTICK_RATE_HZ; //¸ù¾ÝconfigTICK_RATE_HZÉ趨Òç³öʱ¼ä
//reloadΪ24λ¼Ä´æÆ÷,×î´óÖµ:16777216,ÔÚ168MÏÂ,Ô¼ºÏ0.0998s×óÓÒ
fac_ms=1000/configTICK_RATE_HZ; //´ú±íOS¿ÉÒÔÑÓʱµÄ×îÉÙµ¥Î»
SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;//¿ªÆôSYSTICKÖжÏ
SysTick->LOAD=reload; //ÿ1/configTICK_RATE_HZ¶ÏÒ»´Î
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //¿ªÆôSYSTICK
}
修改delay_us()函数
void delay_us(u32 nus)
{
u32 ticks;
u32 told,tnow,tcnt=0;
u32 reload=SysTick->LOAD; //LOADµÄÖµ
ticks=nus*fac_us; //ÐèÒªµÄ½ÚÅÄÊý
told=SysTick->VAL; //¸Õ½øÈëʱµÄ¼ÆÊýÆ÷Öµ
while(1)
{
tnow=SysTick->VAL;
if(tnow!=told)
{
if(tnow<told)tcnt+=told-tnow; //ÕâÀï×¢ÒâÒ»ÏÂSYSTICKÊÇÒ»¸öµÝ¼õµÄ¼ÆÊýÆ÷¾Í¿ÉÒÔÁË.
else tcnt+=reload-tnow+told;
told=tnow;
if(tcnt>=ticks)break; //ʱ¼ä³¬¹ý/µÈÓÚÒªÑÓ³ÙµÄʱ¼ä,ÔòÍ˳ö.
}
};
}
修改delay_ms();
void delay_ms(u32 nms)
{
if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//ϵͳÒѾÔËÐÐ
{
if(nms>=fac_ms) //ÑÓʱµÄʱ¼ä´óÓÚOSµÄ×îÉÙʱ¼äÖÜÆÚ
{
vTaskDelay(nms/fac_ms); //FreeRTOSÑÓʱ
}
nms%=fac_ms; //OSÒѾÎÞ·¨ÌṩÕâôСµÄÑÓʱÁË,²ÉÓÃÆÕͨ·½Ê½ÑÓʱ
}
delay_us((u32)(nms*1000)); //ÆÕͨ·½Ê½ÑÓʱ
}
修改头文件
修改Systick中断、SVC中断、PendSV中断 (USER\stm32f4xx_it.c,屏蔽三个函数)
最后修改FreeRTOSConfig.h
将NVIC_PRIO_BITS定义为4
编译一下,验证是否移植成功。