明眼人看标题就知道其实这是一个操作系统移植的简单问题。在不同的平台上,只要接口一致,主程序就能互相通用。
1、主题
ARM的调试工具已经十分强大了,但是在M$面前还是如同孩子一般幼稚。如果能在Microsoft Visual Studio 2005中建立一个通用的框架,那么ARM平台的程序就可以在x86下设计、调试。完成后拷贝到ADS中编译。
2、移植
当然,要让uC/OS能在VC中使用,首先需要将uC/OS移植到PC上。下面的方案我是在参考了一些代码的基础上总结出来的,难称原创,而且估计有不少错误……
原作者是在BC4.5上编写uC/OS的。Windows有其特殊的变成风格,比如uC的系统定时器、新进程的启动、中断的允许等问题,完全应该交由Windows完成,而进程调度还是得由uC完成。这里面的矛盾只需要让Windows产生的线程处于睡眠状态就可以轻松搞定。
另外中断屏蔽需要用到互斥对象(Mutex),需要时用WaitForSingleObject保持互斥状态,直到进程调度结束。
最不好理解的问题莫过于恢复线程状态,这个[tc]我也不是很懂,还要再研究研究。
3、框架
完成uC之后,需要分别为ARM和PC设定一个编程框架。[tc]选用的是昨天移植好的ARM的框架。大意如下:
(1)首先是低级初始化
[ARM]
还是那些老东西,恢复到“重启”状态、时钟、重入
[PC]
什么都不做,x86就是好啊……
(2)Console级
[ARM]
2410这东西不能使用stdio.h,所以把各种功能函数定义在这里。
[PC]
#include
为了让各种2410功能也能运行于PC,应该在这里设计各种各样的函数。
(3)FrameWork级
[ARM]
设定了分频比、初始化IRQ。但是时钟中断不要修改!初始化MMU。
[PC]
基本上,又是什么都不做。x86,我爱你……
(4)Application级-OSinit
[ARM]
创建两个基本进程。将看门狗中断定义为系统时钟OSTimeTick()(此前用的是Timer4,但是看门狗更适合。)
[PC]
创建两个基本线程,创建时钟线程调用OSTimeTick(),设定Windows线程优先级
从这里开始两个平台已经完全一样了。
4、调试
这件事情滞后考虑。[tc]眼下想把uC/FS搞来移植,uC/TCPIP就免了,太复杂。其实哪个文件系统已经很复杂了……

5 条评论:
不是通常不推荐使用stdlib吗?
我有说过我用了吗?
(的确用了)那可能是因为无论如何都推荐使用C++的新性能,而不要使用C时代遗留下来的老习惯。可是[tc]我写的正是C语言程序,stdlib.h是非常有用的。
昨晚遇到了非常倒霉的问题,那个uC/OS我移植的有问题,信号量方面存在缺陷。网上有个叫文佳的同志移植的uC我看了一下,有中断处理方面的缺陷。
紧张调试中……
奥嚎嚎!
进一步的调试发现也没什么问题。
发表评论