|
文件: | AvrcX_1.0.zip |
大小: | 361KB |
下载: | 下载 |
|
到今天为止,历时一个月,终于为AVR单片机写好了一个多任务系统,为将来的开发奠定了一点基础。同时打算将她开源到网络上,让感兴趣的人测试一下,同时也发现一些问题。
这个系统是参考了 Larry Barello 的 AvrX2.6f 而写成的,当然最大的区别除了 AvrX2.6f 是汇编语言的,而这个是C语言的外,基本的实现思路还是很大的不同。不过我非常感谢 Larry Barelo 贡献的代码,让我非常顺利的完成 Task context 的保存和恢复这一 C 不好处理的过程。为了体现这个系统的启发来自Avrx2.6,我也为她起了一个相近的名字,叫 AvrcX。我不知道 Larry Barelo 会不会因此而生气或者高兴。总之,谁让这家伙为他的系统起了一个很好的名字,把我最想用的字母 X 给用了。
这个系统是用AVR-GCC 4.0.2 写的。曾经我也找了很多其它编译工具,用起来都不顺手顺心,另外,本来就有写了开源的想法,总不能去用商业编译器吧。当然最主要的,还是觉得 GCC 的代码质量还是很高的,一开始我也尝试用汇编写了一些代码,发现 GCC 的 -Os 优化居然不比我的汇编代码多多少,甚至可以说,比我的汇编还高明, 于是我就下决心也不去找什么破解了,GCC 已经足够好了。
这个系统是一个多任务的调度系统,实时的? 我想可能吧,没有测试过,也不知道怎么测试。但我努力想着去把它实现成一个 priority preemtived 的系统,同时每个 Task 也受时间片控制。系统实现了 Semaphore, Mutex,Event 同步机制,当然还有 Timer queue, 不过我没有读懂 Larry Barello 的 AvrX 的 Timer queue 的思想,所以我按我的需求实现了另外一种东西,目的是要提供 waitObjectWithTimeout 这样的方法。系统还实现了一个基于 byte 的 FIFO,可以用作消息队列,或者I/O缓冲。
调度是基于三种 Queue, 运行队列 RunningQueue, 每一个 Monitor ( Semaphore, Mutex, Event) 上的 BlockedQueue,以及 TimerQueue, BlockedQueue 和 TimerQueue 里的 Task 处于 Blocked和 Delay 状态, 它们在条件满足时,被调度并有可能发生抢占。
在基本内核的基础上,我也写了 UART 的基础代码,用它发现了这个系统的很多问题和有趣的地方。
好吧,就写到这里...先放到网络上看看大家感兴趣吗。
顺便放两张,开发过程中的仿真和开发的图片
阅读(2880) | 评论(2) | 转发(0) |