关于Uc/os-II的问题

[复制链接]
 楼主| 逍遥鸿雁 发表于 2013-1-6 08:58 | 显示全部楼层 |阅读模式
如果有一个连续的任务,即一个任务唤醒的条件是上一个任务已经完成并且已经删除,要求他们拥有相同的优先级,使用同一个任务堆栈。这个可能吗?如何实现呢?
ymind 发表于 2013-1-6 09:05 | 显示全部楼层
据我对uCOS-II API的理解,不可能。但你可修改内核实现,来实现这个奇怪的(?)目的。
 楼主| 逍遥鸿雁 发表于 2013-1-6 09:09 | 显示全部楼层
俺是个菜鸟,修改内核。。。。。这个有点难
sufeng983 发表于 2013-1-6 10:29 | 显示全部楼层
本帖最后由 sufeng983 于 2013-1-6 10:33 编辑

可以。
A TASK()
{
结束前:
     发信号量SA到B TASK;
}
B TASK ()
{
        等待信号SA
        {
                 删除 A TASK;
                 启动 C TASK;
        }
}
airwill 发表于 2013-1-6 12:18 | 显示全部楼层
不可能, 参考楼上的任务举例.
删除A 后再建立 C 才能实现使用同一个堆栈的功能.
但楼主的要求是: 一个任务唤醒的条件是上一个任务已经完成并且已经删除, 这里说的是唤醒条件而不是创建条件.
ucOS 不允许相同的优先级.
当然楼主可能真是要的楼上的结果. 那就增加一个管理任务的任务的吧
 楼主| 逍遥鸿雁 发表于 2013-1-7 10:34 | 显示全部楼层
可以在上一个任务中创建下一个任务,在下一个任务中删除上一个任务。这样一来就有两个任务堆栈,两个优先级存在了。
这样做的目的是连续的任务较多,每个任务占用的资源也多。如果不重复使用,内存和优先级就不够用了。
 楼主| 逍遥鸿雁 发表于 2013-1-7 10:36 | 显示全部楼层
可是我的任务堆栈是外部变量,如何才能释放这些任务堆栈呢??
john_lee 发表于 2013-1-7 11:01 | 显示全部楼层
不要删除任务,除非系统具有代码覆盖功能。
sufeng983 发表于 2013-1-7 11:07 | 显示全部楼层
         执行完一个任务之后,才唤醒另外一个任务(还使用同一优先级,同一堆栈)。
         为什么不在一个任务中,把原来的2个所谓的任务,做成2个函数,做成函数切换执行。

        蛋疼青年,蛋疼要求。
 楼主| 逍遥鸿雁 发表于 2013-1-9 11:03 | 显示全部楼层
其实我是菜鸟,做成函数切换执行的方法我也试过,但是总是会被其他任务打断,但是用调度器上锁任务工作就不正常了。
sufeng983 发表于 2013-1-9 12:30 | 显示全部楼层
1、代码执行时,不能被任何东西打断,需要保证代码的连续性,就关中断。
2、如果是使用(UART\SPI\MII\IIC)这样的资源不能被打断,就用互斥。
reayfei 发表于 2013-1-10 08:45 | 显示全部楼层
本帖最后由 reayfei 于 2013-1-10 09:04 编辑

ucos-ii是不允许两个任务拥有同样优先级的,也不能使用同一个任务堆栈。

uTenux可以拥有两个任务,有相同优先级,但是 一个任务堆栈这个好像是不能,

因为创建任务的时候用户只负责申请任务空间的大小,系统自动申请空间。

试试uTenux实时操作系统吧,www.uloong.cc


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 逍遥鸿雁 发表于 2013-1-11 09:10 | 显示全部楼层
我还是试试用uC/OS的任务管理试试吧
zdhlixiang2006 发表于 2013-1-18 15:37 | 显示全部楼层
UCOS 2不允许相同的优先级
yyql008 发表于 2013-1-18 16:13 | 显示全部楼层
你是不是ram不够了.你说的我觉得可以的!
先删除任务A.这样A任务的任务堆栈这块内存浪费了.
等A任务删除掉,我们用A任务的堆栈 建立B任务.
OSTaskCreate(TaskB,
                (void *)0,
                &TASKA_STK[TASKA_STK_SIZE - 1],
               TASKB_PRIO);

这样A任务的堆栈重复利用了.
注意,一定要等到A任务删除掉,才可以这样做.否则系统会跑挂的.可以利用一个技巧,就是A,B任务优先级一样.
这样如果A任务未删除,则建立B任务是建立不成功的.
yyql008 发表于 2013-1-18 17:17 | 显示全部楼层
想不明白为什么要建立一个人又删除,你程序设计的不好? 看看下面另一个方法能否解决问题.
TASK
{
ll:        for(;;)
        {
           if(...)
           break;
        }
       ........
        for(;;)
        {
                if(....)
                break;
        }
        for(;;)
        {
                if(...)
                goto ll;
        }
}
HORSE7812 发表于 2013-8-17 15:44 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:梦依旧。。。

0

主题

4

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部