UCOS-III移植到M3系列

开发板:STM32F103C8T6
开发环境:MDK5.14 、 串口小助手
源码/库:STM32标准固件库V3.5、UCOSIII 3.03

前言
在移植UCOSIII实时操作系统前必须对该操作系统有了一定的了解。

1.移植准备:首先准备移植所需的基础工程,我们可以拿一些基础的工程 LED 灯实验或者自己新建一个新的项目工程。

2.UCOSIII 源码:我们移植 UCOSIII 肯定需要 UCOSIII 源码了。


UCOSIII 3.04 和 UCOSIII 3.03 源码的文件都是一样的,不同的是各个文件里面的有些函数做了修改, UCOSIII 源码各个文件内容如表所示:

 
3.创建工程文件夹
点击鼠标右键新建工程文件夹STM32F103V3.5_uCOS-iii
将CORE、STM32F10x_FWLIB、SYSTEM、USER、OBJ、UCOS-III文件夹创建到STM32F103V3.5_uCOS-iii文件夹中,其中Hardware和Source文件夹根据自己需求自行创建,一般做大型的项目我们都应该要养成这些好的习惯,把文件都分层管理。

 4.向工程文件夹中添加相应的文件
1)将我们解压的3.03版本UCOSIII中UCOSIII 3.03\Micrium\Software目录下的 uC-CPU、 uC-LIB 和 UCOS-III 这三个文件复制到UCOSIII 文件夹中,如图所示:

 

2)在UCOSIII 文件夹下新建两个文件:UCOS_BSP和UCOS_CONFIG
a.将UCOSIII\资料\UCOSIII移植\UCOSIII 3.03\Micrium\Software\EvalBoards\Micrium\uC-Eval-STM32F107\BSP下的bsp.c和bsp.h复制到UCOS_BSP下:

 

b.将UCOSIII 3.03\Micrium\Software\EvalBoards\Micrium\uC-Eval-STM32F107\uCOS-III下的app_cfg.h和cpu_cfg.h等文件复制到UCOS_CONFIG下:

c.USER目录下需要添加的文件如下图所示:


5.向工程中添加相应的目录
所需要添加的目录内容如图所示:

 

 各目录中所需要的文件如图所示:

 

 

添加完以上的目录后,在工程中添加相应的文件路径,如下:

 

 6.修改文件内容
1)修改bsp.c和bsp.h
bsp.c和bsp.h文件位于工程文件夹中UCOSIII\UCOS_BSP下;在官方源码上有一份官方写的例程以及初始化函数我们是不需要的,在bsp.c文件中BSP_Init()、BSP_LED_Init()、BSP_LED_On()、BSP_LED_Off()、BSP_LED_Toggle()、BSP_StatusInit()这些初始化函数我们是不需要的,于是把它们统统都删除掉。在bsp.h下以及其它地方所有的stm32f10x_lib.h都替换成stm32f10x_conf.h,如下图所示:


2)修改os_cpu_a.s或者os_cpu_a.asm (在UCOSIII 3.04源码中),如下图所示:

 

 

 在CM3内核中,OS系统会调用PendSV异常来进行上下文切换。

3)修改os_cfg_app.h
在os_cfg_app.h当中有关于设置ucos3时钟频率,时钟频率如下:
#define OS_CFG_TICK_RATE_HZ 200u /* Tick rate in Hertz (10 to 1000 Hz) */
因此,延时最小只能是5ms,如果强制延时1ms的话,发现延时1ms会失效。
如果要设置最小的延时为1ms,可以调整当前该宏定义OS_CFG_TICK_RATE_HZ为1000。
OS_CFG_TICK_RATE_HZ的值越小,ucos3能够实现更低的功耗,但是高优先级任务的执行不会太及时。反过来说,该值越大,功耗就越高,同时高优先级的任务被执行的延迟时间会更及时!


4)修改lib_cfg.h
由于stm32f103搭载的是20K的SRAM,因此我们需要调整设置堆栈的使用范围,在这里我设置为1K,具体配置多少看自己的需求来进行,但是不能配置超过芯片自身的内存大小!如下图所示:

 


7.编译下载
到这里已经完成了所有的移植步骤,尝试编译是否无误,如果还是编译错误请自行查找原因,或者评论区留言一起讨论,该移植步骤已亲自测试无误。

注:必须要确保先配置好OS时钟节拍

#define delay_osrunning        OSRunning            //OS是否运行标记,0,不运行;1,在运行
#define delay_ostickspersec    OSCfg_TickRate_Hz    //OS时钟节拍,即每秒调度次数
#define delay_osintnesting     OSIntNestingCtr        //中断嵌套级别,即中断嵌套次数

//初始化延迟函数
//当使用ucos的时候,此函数会初始化ucos的时钟节拍
//SYSTICK的时钟固定为AHB时钟的1/8
//SYSCLK:系统时钟频率
void delay_init(u8 SYSCLK)
{
    u32 reload;
     SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//SYSTICK使用外部时钟源     
    fac_us=SYSCLK/8;                        //不论是否使用OS,fac_us都需要使用
    reload=SYSCLK/8;                        //每秒钟的计数次数 单位为K       
    reload*=1000000/delay_ostickspersec;    //根据delay_ostickspersec设定溢出时间
                                            //reload为24位寄存器,最大值:16777216,在72M下,约合1.86s左右    
    fac_ms=1000/delay_ostickspersec;        //代表OS可以延时的最少单位       
    SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;//开启SYSTICK中断
    SysTick->LOAD=reload;                     //每1/OS_TICKS_PER_SEC秒中断一次    
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK
}
 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值