ucosii我来了,盼了很久,终于移植成功了

2019-08-19 17:57发布

看这个家伙的资料也有一段时间了,最近抽个时间来移植了一下,效果还是可以的,不过那个汇编就折腾了好久没弄懂什么意思,大概的知道怎么回事,具体就完全不懂,呵呵,高手就不要嘲笑了,嘿嘿

废话少说,移植过程

用到的资源是:
A、ST公司提供:STM32F10x开发标准库V3.5
B、实验平台:战舰开发板V2.1
C、编译软件:MDK3.8
D、编辑软件:Source Insight_V3.5
E、RTOS:ucosii_V2.92
F、实验现象设计:红灯亮灭各800ms,绿 {MOD}灯亮灭各300ms

一、获取源码
     这个可以百度下载,我们论坛也是有很多的源码工程的,官网可以在这里下载http://micrium.com/downloadcenter/micrium-source-code/
     我移植的是2.92版本


二、获取ucosii源码文件
     解压下载下来的压缩包,看到如下的文件目录结构

红 {MOD}框框就是ucosii源码文件夹了,双击打开

双击红 {MOD}框框的文件夹进去,看到里面的内容,有没小兴奋一下下呢???

没错,这里就是ucosii源码的所在地了

A、在《Ports》文件夹里面的就是ucosCPU打交道的代码了“看文件夹英文名字就知道了”
B、
在《Source》文件夹里面的就是ucos的核心代码了
C、至于os_cfg.h这个文件是干啥的,双击打开一看开头的说明,哦。。。原来是裁剪用的,呵呵,比如打开什么功能,关闭什么功能用的等等,具体请看后面的注释

三、新建测试工程

这里新建立一个工程,比如ucosii什么的(自己建立好就行),我就在工程里面建立了三个文件夹来存放ucosii的代码。根据自己的喜好建立就好,呵呵
 1、将上面提到的《Source》文件夹里面的文件拷贝到《CORE》文件夹里面,这里面的文件是ucos的核心代码,不用修改。
2、
将上面提到的《Ports》文件夹里面的文件拷贝到《PORTS》文件夹里面,这里就是移植的核心部分了
3、返回上一级文件夹,将“os_cfg.h”这个文件拷贝到《CONFIG》这个文件夹里面,这里还要添加一个文件,这个文件不在《uCOS-II》这个文件夹里面,具体在哪里呢???
在这里“...ucosApp”这个路径下,看到没“includes.h”这个文件,拷贝到《CONFIG》这个文件夹里面。
4、
在MDK(当然喜欢用其他编辑器的同志也是可以的)添加文件,如下图所示,具体视个人喜好建立目录结构了,我建立了《UCOSII_CORE》、《UCOSII_PORTS》、《UCOSII_CONFIG》这三个文件夹存放ucos的相关代码。


哈哈。。。接下来就是爽歪歪的环节了。。。

四、修改代码

1、
地球人都知道的,人有心跳,操作系统也不例外,双击打开“os_cfg.h”这个文件,找到“OS_TICKS_PER_SEC”这个宏定义,原文的是1000即1秒钟了(看后面的注释),这里我将它改为200也就是5ms的节拍,至于这个5ms怎么得来的,根据代码算一下就出来了


2、找到“OS_MAX_TASKS”这个宏定义,看这个名字就知道干啥的吧,没错,就是最大的任务数,这里我定义为5即最多5个任务,具体数量自己掂量


3、
这里我们关闭一部分ucos的功能,例如OS_DEBUG_EN、OS_EVENT_MULTI_EN、OS_EVENT_NAME_EN等等,具体的功能请看定义后面的注释或者本工程代码。

4、前面说到了操作系统的心跳,这里可以用多种方式提供,在CM3里面有个嘀嗒定时器,这个家伙就可以提供了,所以这里我们用它来做操作系统的心跳。修改本工程sys.h中的宏定义_SYSTEM_SUPPORT_ROTS将它的值改为1【如果用到原子哥的SYSTEM文件夹的话,直接将SYSTEM_SUPPORT_UCOS宏定义修改为1即可】。

5、打开“os_cpu_a.asm”文件,修改相关的汇编

A、首先看到的是前面的函数入口代码


修改成上图这个样子,呵呵

B、接着伪定义寄存器和相关的数值


具体寄存器地址和相关的数值可以参考《Cortex-M3权威指南(中文).pdf》第284~286页之间的内容
C、接着下面的改成下图样子



D、
将文件拖到最后,那里的程序标好字符就要参考文件开头的定义进行改变了,具体参考代码

6、
打开“os_cpu.h”文件,这里主要就是修改相关的数据类型的,视不同平台而修改,详细文件内容见工程。



7、
打开“includes.h”这个文件,这里主要就是集合了需要的头文件,删除或者注释一些没用到的,增加里面没有但是需要用到的。详细见工程文件。

A、找到下图处,将其全部注释掉,或者删掉也行,因为这些库这里没用到,但是你的工程有用到的话就保留吧,V2.86之前的版本好像定义了这些文件



B、
找到这里,将这个库头文件修改一下



五、main函数编辑


1、
在main函数中增加以下内容,注意了,优先级的数值越大就越低,0是最高的优先级,就这样
/* 起始任务相关设置 */ //任务优先级 #define Start_Task_PRIO          10  //优先级最低   //任务堆栈大小 #define Start_STK_Size            64   //任务堆栈空间大小 OS_STK Start_Task_STK[Start_STK_Size];   //任务接口函数 void start_task(void *pdata);     /* LED0任务0 */ //任务优先级 #define LED0_Task_PRIO          7  //优先级最低   //任务堆栈大小 #define LED0_STK_Size            64   //任务堆栈空间大小 OS_STK LED0_Task_STK[LED0_STK_Size];   //任务接口函数 void LED0_task(void *pdata);     /* LED1任务1 */ //任务优先级 #define LED1_Task_PRIO          6  //优先级最低   //任务堆栈大小 #define LED1_STK_Size            64   //任务堆栈空间大小 OS_STK LED1_Task_STK[LED1_STK_Size];   //任务接口函数 void LED1_task(void *pdata);   上面的主要是设置任务的堆栈大小和中断的优先级了
2、创建任务
int main(void) { OS_Heart_Init();  //初始化ucos心跳 MY_NVIC_PriorityGroup_Config(NVIC_PriorityGroup_2);  //初始化中断优先级 USART1_Init(9600); LED_Init();  //初始化LED硬件接口   printf("  system init OK! enter os... ");   OSInit();  //初始化ucos OSTaskCreate(start_task, (void *)0, (OS_STK *)&Start_Task_STK[Start_STK_Size-1], Start_Task_PRIO);  //创建起始任务 OSStart();  //ucos启动 } /****************************************************************************** * Function Name --> 开始任务 * Description   --> none * Input         --> *pdata: 任务指针 * Output        --> none * Reaturn       --> none  ******************************************************************************/ void start_task(void * pdata) { OS_CPU_SR cpu_sr=0;   pdata = pdata; OS_ENTER_CRITICAL();  //进入临界区,无法被中断打断
printf("  start task ");
OSTaskCreate(LED0_task, (void *)0, (OS_STK *)&LED0_Task_STK[LED0_STK_Size-1], LED0_Task_PRIO); OSTaskCreate(LED1_task, (void *)0, (OS_STK *)&LED1_Task_STK[LED1_STK_Size-1], LED1_Task_PRIO); OSTaskSuspend(Start_Task_PRIO);  //挂起起始任务 OS_EXIT_CRITICAL();  //退出临界区,可以被中断打断 } /****************************************************************************** * Function Name --> 任务0 * Description   --> none * Input         --> *pdata: 任务指针 * Output        --> none * Reaturn       --> none  ******************************************************************************/ void LED0_task(void * pdata) { while(1) { LED0 = 0; delay_ms(800); LED0 = 1; delay_ms(800); }; } /****************************************************************************** * Function Name --> 任务1 * Description   --> none * Input         --> *pdata: 任务指针 * Output        --> none * Reaturn       --> none  ******************************************************************************/ void LED1_task(void * pdata) { while(1) { LED1 = 0; delay_ms(300); LED1 = 1; delay_ms(300);   }; }
六、编译改错

上面工作准备好之后,这时就编译改错即可。直到没有错误和警告,大功告成,哈哈。。。下载到板子上,看到两个灯在不停的闪烁了。一个闪的快一点,一个闪的慢一点



总结:

1、ucosii这个操作系统移植起来还是比较简单的,主要就是这个汇编文件的移植,对应不同的平台用相应平台的代码。
2、如果懒得修改什么的,上官网下载对应的测试工程也是可以的
3、可裁剪性,这个功能非常好,根据不同的任务和需求裁剪自己需要的即可
4、小小的献丑,高手莫见怪了
5、附件是战舰开发板的测试工程,希望能帮到新手
6、也欢迎各位高手、大神拍砖指导,大家学习学习,共同进步

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
49条回答
八度空间
1楼-- · 2019-08-20 06:40
回复【3楼】jiaozhu:
---------------------------------
感谢帮顶!!!共同学习,共同进步
jiaozhu
2楼-- · 2019-08-20 11:12
回复【5楼】Badu_Space:
---------------------------------
32位汇编指令太多了,记不住。这种常用的CPU人家都移植过了,汇编代码都写好了,咱就复制过来用用。好像这种main函数的结构模式都固定了。怎么不去搞III啊 ,III比II强大许多。
八度空间
3楼-- · 2019-08-20 17:01
回复【7楼】jiaozhu:
---------------------------------
有些什么新意呢?迟点吧
jiaozhu
4楼-- · 2019-08-20 19:57
 精彩回答 2  元偷偷看……
八度空间
5楼-- · 2019-08-20 21:41
官网不是有现成的测试工程么?
shibusha
6楼-- · 2019-08-21 02:22
写的很详细,不错

一周热门 更多>