贴一个半成品,mega128的UCOS改进版
winavr 2009版保留了event mutex sem
队列邮箱flag都删掉了,这些东西个人认为没啥用
时钟节拍处理还是采用了ucos减计数的方式,抛弃了freertos的链表方式
中断处理结合了freertos方式
无任何汇编代码
抛弃了传统移植中的os_cpu.c os_cpu.asm
全部移植均采用C语言的函数
抛弃了原始的ucos_ii.c那种include方式
点击此处下载 ourdev_458999.rar(文件大小:180K) (原文件名:newos-6-19.rar) 顶楼主。
个人移植ucOS,空闲不运行空闲任务,而运行主函数。
时钟节拍处理还是采用了ucos减计数的方式,抛弃了freertos的链表方式
----------------------------------------------------------------
没太注意ucos节拍计数。是每个节拍,每个任务(或者是等待延时的任务)都要进行减节拍计数吗?
small rtos节拍计数如此。个人不太喜欢这种计数方法,但好像没有更好的办法。
中断处理结合了freertos方式
------------------------------------
对于AVR,我的做法是用 一般任务切换代替中断任务切换。即用OsCtxSw代替OSIntCtxSw。
中断切换任务改成中断先保护寄存器(由C编译器自动完成,中断写法和一般中断写法一样),然后再主动调用OsCtxSw进行任务切换。
任务切换只存在主动切换。断点保护也不保护所有寄存器。
(这种做法只适合不支持硬件中断嵌套的MCU) 不错!下载了,谢谢!
严重优化UCOS,^_^ 不错,下了谢谢! 2楼,减计数其实也是一个不错的办法,不用考虑时钟节拍计数器的溢出。
如果采用延时链表,首先需要将延时的任务排序,这里是一笔不小的开销。
当然,拍完后只需比较最上面的一个延时任务。
可经过我示波器观察,发现关中断时间还不短,因此最后舍弃了延时链表方式,采用原始的减计数。
至于空闲任务,我还是那个说法。
为了思路清晰,没必要舍弃空闲任务。
并没有带来多大的开销。
所有中断都支持中断嵌套。 mark zhichi 支持 支持 MARK 这位ralfak 大哥,我为什么装进AVR Studio仿真跑会出现问题呢?路不进TASK1或2中。好像是跑飞了。PIN脚从来没有动过。我自己建项目就编译不过。为什么啊。是不是MAKEFILE要修改啊?用AVR Studio自动生成的不行吧?我用官方的也不能编译过,出一大堆的错。谢谢指点。 今天跟踪了一下,是跑进了空闪程序,再也不出来了。为什么会这样呢? 9-10楼,编译器为winavr-200903版
不要导入项目,直接用命令行make,make clean即可,然后用AVRSTUDIO装入myos.exf,编译是没问题的,仿真也没问题,没长时间测试过。 有一处bug
在core.c里面
多了一个OS_EXIT_CRITICAL();
会产生未知错误
void OS_ISR_Sched(void)
{
INT8U y;
OS_ENTER_CRITICAL();
/*
没加锁的情况下允许调度
*/
if (OSLockNesting == 0) /* ... scheduler is not locked */
{
y = OSUnMapTbl;
OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl]);
if (OSPrioHighRdy != OSPrioCur) /* No Ctx Sw if current task is highest rdy */
{
OSTCBHighRdy = OSTCBPrioTbl;
// OSCtxSwCtr++; /* Increment context switch counter */
OSMissedSchedu = OS_TRUE; /*通知中断有新的高优先级任务就绪 */
}
}
OS_EXIT_CRITICAL();
} 重新打包一下代码
点击此处下载 ourdev_472451.rar(文件大小:216K) (原文件名:newos-6-19.rar)
软件硬件调试时请自行修改延时 mark 不错;值得学习;
页:
[1]