打印
[牛人杂谈]

uCOS II 2.92在nuvoton M051上的移植

[复制链接]
1547|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhuomuniao110|  楼主 | 2016-8-24 21:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
uCOS II 2.92移植到nuvoton M051上的,在M052_TINY-EVB 评估板上运行ok,实现最简单的功能:闪烁LED。
LED 1 wih uCOSII 20140210ok.rar (217.66 KB)



沙发
zhuomuniao110|  楼主 | 2016-8-24 21:15 | 只看该作者
初步成功移植了uCOS II 2.92在nuvoton M051上,之后接着按照《嵌入式实时操作系统UCOS-II》上的测试步骤,验证uCOS是否完全移植成功。但接下来的验证过程中的遇到的问题挺难办的:
     1、单步跟踪调试跑到OSStart() --- OSStartHighRdy() 下面的OSStartHang语句跑不出去了,但全速运行时可以出去的,迷茫!
     是程序问题呢,还是keil软件问题呢,或者nuvoton调试器问题?根据书上13.06.02节描述的,和我个人理解,OSStartHang前面的语句已经触发了PendSV中断,且CPSIE   I  开了中断,本应该跳去执行PendSV中断的(PendSV中断入口、函数等是正确的),怎么会跑到OSStartHang里面呢?若此时不用单步运行,改用全速运行,则是跑出来的,且正常运行了。
     百度下,也有遇到类似问题的,例如:移植UCOS,遇到B OSStartHang的问题及其解决方法 对于这个说法,我看了下代码,不是这个他说的那个原因导致的!对于ucosii移植问题请大家帮忙。。。的说法,我也有些怀疑,就如前面所说,“OSStartHang前面的语句已经触发了PendSV中断,且CPSIE   I  开了中断,本应该跳去执行PendSV中断的”,难道我理解出错了???或者中断不会立即触发?需要等待?那要等待多久呢?继续努力...
    (15:30)根据上面的思路,当其进入OSStartHang时,我用“运行到光标处”命令,则会运行到OS_CPU_PendSVHandler,此时接着跑下去就到了main里面AppTaskStart中了,这是正常正确的运行结果!若把AppTaskStart任务去掉,则第一个运行的应该是Idle任务了!随便说下,调试时,keil 4窗口下面的DEBUG时间一直都是0,没起到作用。到现在,可以初步猜测:单步跟踪跑到OSStartHang跟不下去,可能是PendSV中断不会立即触发的原因导致的!或许哪天我无聊,可以试试一直按单步命令直到他跑出来!但现在我试了按百多次还是没有出来的!
    (16:00)继续浏览,对比了在IAR下编辑的ucos程序可以正常的单步调试吗?正常复位运行没有问题中的类似现象及二楼所描述的,或许nuvoton能帮上忙,找时间请教请教这个问题!
OSStartHighRdy
    LDR     R0, =NVIC_SYSPRI14                                  ; Set the PendSV exception priority
    LDR     R1, =NVIC_PENDSV_PRI
    STR     R1, [R0]                                            ; Not storing entire byte with STRB to avoid error

    MOVS    R0, #0                                              ; Set the PSP to 0 for initial context switch call
    MSR     PSP, R0

    LDR     R0, =OS_CPU_ExceptStkBase                           ; Initialize the MSP to the OS_CPU_ExceptStkBase
    LDR     R1, [R0]
    MSR     MSP, R1   

    LDR     R0, =OSRunning                                      ; OSRunning = TRUE
    MOVS    R1, #1
    STRB    R1, [R0]

    LDR     R0, =NVIC_INT_CTRL                                  ; Trigger the PendSV exception (causes context switch)
    LDR     R1, =NVIC_PENDSVSET
    STR     R1, [R0]

    CPSIE   I                                                   ; Enable interrupts at processor level

OSStartHang
    B       OSStartHang                                         ; Should never get here
    2、前天那个工程,编译后的信息如下
Program Size: Code=6868 RO-data=628 RW-data=108 ZI-data=3876
估算下,RW+ZI就接近4k了,M051的RAM也快用完了,再加个任务就可能跑飞了。so应用时,需要通过os_cfg.h对uCOS进行优化下,以节省空间!

使用特权

评论回复
板凳
zhuomuniao110|  楼主 | 2016-8-24 21:16 | 只看该作者
Nuvoton NuMicro ICP Programmer界面简单实用,新唐系列芯片开发基本都使用这个软件,当然也需要NuLink(下载器)的硬件支持。厂商是台湾的,所以一些术语有点不一样,他们指的“编程”,就是我们平时所说的,“下载”“烧写”。
1 连接好目标板,NuLink,电脑。
2 打开ICP Programmer,会弹出选项选择芯片系列,点击“继续”。
3 跳到下载界面,点击连接。
4 读取到芯片信息之后,我们需要关注的其实就是APROM,点击它选择要下载的MCU执行代码(bin/hex)
5 配置位--主要关注电压4.5V,一般不用设置。
6 编程--主要关注APROM Config都要选上。
7 点击“Start”即可,可能会碰到弹框,按需选择即可。
批量编程模式,即是批量下载的意思,这个选择了“是”,那么烧录完一个芯片,可以拔开插头,继续插另外的芯片,ICP会自动识别芯片,擦除和烧写刚才的程序。这样可以节省很多时间。

使用特权

评论回复
地板
598330983| | 2016-8-24 22:26 | 只看该作者
μC/OS-II由Micrium公司提供,是一个可移植、可固化的、可裁剪的、占先式多任务实时内核,它适用于多种微处理器,微控制器和数字处理芯片(已经移植到超过100种以上的微处理器应用中)。

使用特权

评论回复
5
dongnanxibei| | 2016-8-25 17:42 | 只看该作者
 μC/OS-III相比于μC/OS-II做了很多的改进,是一款全新的内核,在效率方面有了很大提升,并且支持任务的时间片轮转调度,摒弃了一些不必要的内容,如消息邮箱,对于熟悉μC/OS-II的工程师来说,上手μC/OS-III还是比较容易的

使用特权

评论回复
6
dongnanxibei| | 2016-8-25 17:43 | 只看该作者
一、时钟节拍的改进

  在RTOS中,任务可通过调用延时函数(如OSTimeDly( )函数)将自己延时挂起一段时间,任务在延时的过程中会释放CPU,延时的任务不占用宝贵的CPU资源,而是由时钟节拍服务统一管理,时钟节拍服务是一个周期性运行的任务,由周期的时钟节拍中断触发,而时钟节拍中断可由硬件定时器产生,以此来分担CPU的工作量。

  在μC/OS-II中,时钟节拍服务是在时钟节拍中断服务程序中完成的,每次时钟节拍服务都会遍历整个任务链表,依次处理每个任务,如果该任务的延时计数为0,则跳过该任务,如果计数非0,则进行减1操作,并判断减1后是否为0,为0则表明延时时间已到,使相关任务进入就绪态。如果系统的任务数目较多的话,时钟节拍服务遍历整个任务链表的时间较长,而且该服务函数在中断中被调用,因此也会导致中断执行的时间过长,不符合实时操作系统的设计理念。

  在μC/OS-III中,周期性的硬件定时器通过中断触发中断服务函数,在中断服务函数中调用时钟节拍服务函数,但是该时钟节拍服务函数不需要遍历整个任务链表,只是发送一个信号量,即可结束中断,时钟节拍任务接收该信号量,恢复运行,处理延时函数,为了提高时钟节拍的处理速度,还采用了哈希散列表机制来管理任务,使得查找速度更加高效合理。

使用特权

评论回复
7
dongnanxibei| | 2016-8-25 17:43 | 只看该作者
二、任务调度的改进

  在μC/OS-II中,任务调度是完全基于优先级的,每个任务都有不同的优先级,不允许2个任务具有相同的优先级,并且支持的任务数量是有限制的。

  在μC/OS-III中,可以支持任意数目的任务和优先级,用户根据实际情况来定,当然在实时操作系统中,要尽可能的精简任务数目,在μC/OS-III中,增加了任务的时间片轮转调度算法,也就是说不同的任务允许具有相同的优先级,因此,任务的数量就可以不受优先级数量的限制了,每一个优先级的任务数量可以有多个,同一优先级的任务根据实际需要分配执行时间,时间到时释放CPU,使得其它任务得以执行,如此循环往复。除此之外,还对任务优先级查找算法进行了改进,在此不再详述。

使用特权

评论回复
8
dongnanxibei| | 2016-8-25 17:49 | 只看该作者
三、信号量的改进

  在多任务实时操作系统中,信号量是最基本最常用的机制,用来实现任务之间的通信和同步、任务和中断之间的通信和同步以及对共享资源的访问,在μC/OS-II中,提供了基本的信号量创建、等待和释放等操作。

  在μC/OS-III中,对信号量的使用增加了一些可选参数,如非阻塞等待、释放但不进行任务调度等操作,具有较高的灵活性。更为方便和重要的是,在μC/OS-III中增加了任务内嵌的信号量,用户无需创建信号量便可和其它任务通信,使用起来比普通信号量更加简单高效。比如两个任务之间的数据传送很明确,任务A接收数据完成后,只有任务B来执行数据的处理,也就是说只有一个任务等待任务A的信号量,而且任务A知道要将信号量发送给哪个任务,便可以使用内嵌信号量来进行通信和同步。

  四、小结

  以上仅列举了几点在μC/OS-III中比较重要的改进,μC/OS-III实时内核无论在效率、稳定性、用户使用灵活性方面都做了重要的改进,是一款全新的实时内核,详见书籍《嵌入式实时操作系统μC/OS-III》。

使用特权

评论回复
9
zhuomuniao110|  楼主 | 2016-8-25 21:27 | 只看该作者
移植要考虑够不够放代码,如果闪存不够可不行

使用特权

评论回复
10
zhuomuniao110|  楼主 | 2016-8-27 21:46 | 只看该作者
单步跟踪跑到OSStartHang跟不下去

使用特权

评论回复
11
734774645| | 2016-8-28 11:22 | 只看该作者
移植的理论是什么,怎么移植,修改什么,如何匹配,不同配置的MCU怎么匹配同一个系统。

使用特权

评论回复
12
zhuomuniao110|  楼主 | 2016-8-28 11:39 | 只看该作者
 在μC/OS-III中,可以支持任意数目的任务和优先级

使用特权

评论回复
13
戈卫东| | 2016-8-28 11:41 | 只看该作者
zhuomuniao110 发表于 2016-8-27 21:46
单步跟踪跑到OSStartHang跟不下去

正常。
因为再也不会回到后面的代码了

使用特权

评论回复
14
戈卫东| | 2016-8-28 11:42 | 只看该作者
uC-OS用到M051可能太过笨重了。

使用特权

评论回复
15
643757107| | 2016-8-28 11:44 | 只看该作者
戈卫东 发表于 2016-8-28 11:42
uC-OS用到M051可能太过笨重了。

是的,这个M051适合跑裸机。

使用特权

评论回复
16
戈卫东| | 2016-8-28 11:47 | 只看该作者
643757107 发表于 2016-8-28 11:44
是的,这个M051适合跑裸机。

那也不见得。
一些“轻便”的KERNEL只要几百字节的ROM和几十个字节的RAM。

使用特权

评论回复
17
643757107| | 2016-8-28 11:49 | 只看该作者
戈卫东 发表于 2016-8-28 11:47
那也不见得。
一些“轻便”的KERNEL只要几百字节的ROM和几十个字节的RAM。

有这样轻便的吗?求推荐

使用特权

评论回复
18
zhuomuniao110|  楼主 | 2016-8-30 18:48 | 只看该作者
反正常用的就是这么几种,主流为主。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

205

主题

3349

帖子

10

粉丝