ralfak 发表于 2009-7-6 23:08:54

贴一个半成品,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)

void_c 发表于 2009-7-7 06:49:01

顶楼主。

个人移植ucOS,空闲不运行空闲任务,而运行主函数。


时钟节拍处理还是采用了ucos减计数的方式,抛弃了freertos的链表方式
----------------------------------------------------------------
没太注意ucos节拍计数。是每个节拍,每个任务(或者是等待延时的任务)都要进行减节拍计数吗?
small rtos节拍计数如此。个人不太喜欢这种计数方法,但好像没有更好的办法。


中断处理结合了freertos方式
------------------------------------
对于AVR,我的做法是用 一般任务切换代替中断任务切换。即用OsCtxSw代替OSIntCtxSw。
中断切换任务改成中断先保护寄存器(由C编译器自动完成,中断写法和一般中断写法一样),然后再主动调用OsCtxSw进行任务切换。
任务切换只存在主动切换。断点保护也不保护所有寄存器。
(这种做法只适合不支持硬件中断嵌套的MCU)

WOTASOM 发表于 2009-7-7 10:52:59

不错!下载了,谢谢!
严重优化UCOS,^_^

eddia2000 发表于 2009-7-7 11:04:49

不错,下了谢谢!

ralfak 发表于 2009-7-8 22:50:28

2楼,减计数其实也是一个不错的办法,不用考虑时钟节拍计数器的溢出。
如果采用延时链表,首先需要将延时的任务排序,这里是一笔不小的开销。
当然,拍完后只需比较最上面的一个延时任务。
可经过我示波器观察,发现关中断时间还不短,因此最后舍弃了延时链表方式,采用原始的减计数。

至于空闲任务,我还是那个说法。
为了思路清晰,没必要舍弃空闲任务。
并没有带来多大的开销。

所有中断都支持中断嵌套。

xyq4513 发表于 2009-7-10 10:50:11

mark

longquan 发表于 2009-7-11 00:23:44

zhichi 支持

liming 发表于 2009-7-11 08:49:22

支持

xaofen 发表于 2009-7-11 09:01:46

MARK

whyzhb 发表于 2009-7-29 14:58:36

这位ralfak 大哥,我为什么装进AVR Studio仿真跑会出现问题呢?路不进TASK1或2中。好像是跑飞了。PIN脚从来没有动过。我自己建项目就编译不过。为什么啊。是不是MAKEFILE要修改啊?用AVR Studio自动生成的不行吧?我用官方的也不能编译过,出一大堆的错。谢谢指点。

whyzhb 发表于 2009-7-30 17:01:16

今天跟踪了一下,是跑进了空闪程序,再也不出来了。为什么会这样呢?

ralfak 发表于 2009-8-19 01:29:22

9-10楼,编译器为winavr-200903版
不要导入项目,直接用命令行make,make clean即可,然后用AVRSTUDIO装入myos.exf,编译是没问题的,仿真也没问题,没长时间测试过。

ralfak 发表于 2009-8-19 02:36:55

有一处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();
}

ralfak 发表于 2009-8-19 02:38:13

重新打包一下代码
点击此处下载 ourdev_472451.rar(文件大小:216K) (原文件名:newos-6-19.rar)
软件硬件调试时请自行修改延时

Dream_catcher 发表于 2009-11-23 09:54:49

mark

wchp314 发表于 2009-12-14 16:15:01

不错;值得学习;
页: [1]
查看完整版本: 贴一个半成品,mega128的UCOS改进版