打印

关于Uc/os-II的问题

[复制链接]
2175|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
逍遥鸿雁|  楼主 | 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;
        }
}

使用特权

评论回复
5
airwill| | 2013-1-6 12:18 | 只看该作者
不可能, 参考楼上的任务举例.
删除A 后再建立 C 才能实现使用同一个堆栈的功能.
但楼主的要求是: 一个任务唤醒的条件是上一个任务已经完成并且已经删除, 这里说的是唤醒条件而不是创建条件.
ucOS 不允许相同的优先级.
当然楼主可能真是要的楼上的结果. 那就增加一个管理任务的任务的吧

使用特权

评论回复
6
逍遥鸿雁|  楼主 | 2013-1-7 10:34 | 只看该作者
可以在上一个任务中创建下一个任务,在下一个任务中删除上一个任务。这样一来就有两个任务堆栈,两个优先级存在了。
这样做的目的是连续的任务较多,每个任务占用的资源也多。如果不重复使用,内存和优先级就不够用了。

使用特权

评论回复
7
逍遥鸿雁|  楼主 | 2013-1-7 10:36 | 只看该作者
可是我的任务堆栈是外部变量,如何才能释放这些任务堆栈呢??

使用特权

评论回复
8
john_lee| | 2013-1-7 11:01 | 只看该作者
不要删除任务,除非系统具有代码覆盖功能。

使用特权

评论回复
9
sufeng983| | 2013-1-7 11:07 | 只看该作者
         执行完一个任务之后,才唤醒另外一个任务(还使用同一优先级,同一堆栈)。
         为什么不在一个任务中,把原来的2个所谓的任务,做成2个函数,做成函数切换执行。

        蛋疼青年,蛋疼要求。

使用特权

评论回复
10
逍遥鸿雁|  楼主 | 2013-1-9 11:03 | 只看该作者
其实我是菜鸟,做成函数切换执行的方法我也试过,但是总是会被其他任务打断,但是用调度器上锁任务工作就不正常了。

使用特权

评论回复
11
sufeng983| | 2013-1-9 12:30 | 只看该作者
1、代码执行时,不能被任何东西打断,需要保证代码的连续性,就关中断。
2、如果是使用(UART\SPI\MII\IIC)这样的资源不能被打断,就用互斥。

使用特权

评论回复
12
reayfei| | 2013-1-10 08:45 | 只看该作者
本帖最后由 reayfei 于 2013-1-10 09:04 编辑

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

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

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

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


物联网·开源·嵌入式操作系统μTenux是Cortex M用户的新选择.pdf

4.01 MB

使用特权

评论回复
13
逍遥鸿雁|  楼主 | 2013-1-11 09:10 | 只看该作者
我还是试试用uC/OS的任务管理试试吧

使用特权

评论回复
14
zdhlixiang2006| | 2013-1-18 15:37 | 只看该作者
UCOS 2不允许相同的优先级

使用特权

评论回复
15
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任务是建立不成功的.

使用特权

评论回复
16
yyql008| | 2013-1-18 17:17 | 只看该作者
想不明白为什么要建立一个人又删除,你程序设计的不好? 看看下面另一个方法能否解决问题.
TASK
{
ll:        for(;;)
        {
           if(...)
           break;
        }
       ........
        for(;;)
        {
                if(....)
                break;
        }
        for(;;)
        {
                if(...)
                goto ll;
        }
}

使用特权

评论回复
17
HORSE7812| | 2013-8-17 15:44 | 只看该作者
mark

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:梦依旧。。。

0

主题

4

帖子

0

粉丝