打印

哪里有RTX51-TINY的技术支持?

[复制链接]
2120|19
手机看帖
扫描二维码
随时随地手机跟帖
沙发
ayb_ice| | 2012-2-17 10:34 | 只看该作者
KEIL HELP

使用特权

评论回复
板凳
刘前辈| | 2012-2-17 12:55 | 只看该作者
我们公司和KEIL有直接联系。

有什么问题?请提,TINY 我们直接解决。提得好有奖励。

、、

使用特权

评论回复
地板
ningling_21|  楼主 | 2012-2-17 13:50 | 只看该作者
以下分别向其它两个任务发送信号
if(flag_bao==1||flag_uart==1)                  //任务2运行条件满足
{
                            os_send_signal(2);           //给任务2发信号
}
else if(flag_cun==1||flag_cun1==1)         //任务3运行条件满足           
{
                            os_send_signal(3);           //给任务3发信号
}
任务2最后等待信号
。。。。。。。。。
if(flag_bao==1)                                                                          //有数据上报
{
                            。。。。。。。。。
}
os_wait1(K_SIG);                                                                      //退出该任务,任务2等待信号

任务3最后等待信号
。。。。。。。。。
if(flag_save_time==1)                                                              //有数据要保存
{
                            。。。。。。。。。
}                 
os_wait1(K_SIG);                                                                      //退出该任务,任务3等待信号

以下任务2的中间等信号,在任务2中第一处(收到查询命令)
         if(qdjz||dzbq_sqs)                                                           //待写数不为0
         {
                                     while(dxs||sqs0||dzbq_sqs)
                                     {                                             
                                               os_wait1(K_SIG);                        //退出该任务,等待信号               
                                     }
         }
         else if(flag_cun==1||flag_cun1==1)                           //切换到任务3条件满足
         {
                                     os_wait1(K_SIG);                                 //退出该任务,等待信号               
         }
以下任务2的中间等信号,在任务2中第二处(收到转发命令)
         if(qdjz||dzbq_sqs)                                                           //待写数不为0
         {
                                     while(dxs||sqs0||dzbq_sqs)
                                     {                                             
                                               os_wait1(K_SIG);                        //退出该任务,等待信号               
                                     }
         }
         else if(flag_cun==1||flag_cun1==1)                           //切换到任务3条件满足
         {
                                     os_wait1(K_SIG);                                 //退出该任务,等待信号               
         }

以下任务3的中间等信号
while(jh!=0&&jh!=4)   
{
                            os_wait1(K_SIG);                                          //退出该任务,等待信号      
}

请问以上的结构会不会导致RTX51-TINY任务调度出现问题,例如任务死锁,不能切换等...

使用特权

评论回复
5
ayb_ice| | 2012-2-17 16:01 | 只看该作者
首先不存在任务不能切换的问题,因为你用了轮转切换功能
其次任务死锁也不太可能,还是因为使用了轮转,至于逻辑错误导致死锁的问题只有你自己知道是否有逻辑错误

使用特权

评论回复
6
ningling_21|  楼主 | 2012-2-17 16:05 | 只看该作者
首先不存在任务不能切换的问题,因为你用了轮转切换功能
其次任务死锁也不太可能,还是因为使用了轮转,至于逻辑错误导致死锁的问题只有你自己知道是否有逻辑错误 ...
ayb_ice 发表于 2012-2-17 16:01


在RTX的配置文件里已经关闭了时间片轮转调度方式... 而采用信号触发的方式任务调度的...

使用特权

评论回复
7
ayb_ice| | 2012-2-17 16:55 | 只看该作者
本帖最后由 ayb_ice 于 2012-2-18 08:23 编辑

6# ningling_21

没有关闭轮转功能

使用特权

评论回复
8
刘前辈| | 2012-2-17 16:55 | 只看该作者
本帖最后由 刘前辈 于 2012-2-17 17:00 编辑
以下分别向其它两个任务发送信号
if(flag_bao==1||flag_uart==1)                  //任务2运行条件满足
{
    os_send_signal(2);           //给任务2发信号
}
else if(flag_cun==1||flag_cun1==1)         //任务3运行条件满足           
{
    os_send_signal(3);           //给任务3发信号
}



先说上面发信号函数,os_send_signal(id);这个函数没有调度(释放CPU)功能,任务中如果调用了os_send_signal(id);之后,任务照常执行下面的语句,并不引发调度程序而释放CPU。——不过是使id任务就绪,具备了执行条件而已;所以应该这么写:

假定给任务2发信号,并使其由就绪转入运行:
os_send_signal(2);
os_switch_task();  // 执行调度,释放CPU。


、、

使用特权

评论回复
9
刘前辈| | 2012-2-17 17:33 | 只看该作者
本帖最后由 刘前辈 于 2012-2-17 17:40 编辑

LZ厉害,知道关闭时间片轮转调度模式,仅保留(信号)事件驱动调度模式,应用正确。

Tiny是2种调度模式的混合,1、任务自我调度管理;和 2、内核时间片调度管理。其中2、内核管理是通过时间片强制切换,在多种调度方式混合的RTOS设计中,都(理所当然地)可以给用户灵活配置的自由度来关闭这种时间驱动抢占调度模式,而只保留(信号)事件驱动调度模式。
  

、、

使用特权

评论回复
10
ningling_21|  楼主 | 2012-2-17 17:49 | 只看该作者
先说上面发信号函数,os_send_signal(id);这个函数没有调度(释放CPU)功能,任务中如果调用了os_send_signal(id);之后,任务照常执行下面的语句,并不引发调度程序而释放CPU。——不过是使id任务就绪,具备了执 ...
刘前辈 发表于 2012-2-17 16:55


os_send_signal(2);
那么只发送信号,不调用任务切换函数,是不是一定有问题或者有可能有问题呢?

使用特权

评论回复
11
刘前辈| | 2012-2-17 18:52 | 只看该作者
本帖最后由 刘前辈 于 2012-2-17 18:58 编辑
os_send_signal(2);
那么只发送信号,不调用任务切换函数,是不是一定有问题或者有可能有问题呢?


很简单,如果只调用os_send_signal(2); 又关闭了时间片,那么当然程序继续执行os_send_signal(2);后面的语句,程序只会在本任务里while(1)循环,除非你调用了os_wait( )函数,os_wait( )函数带有调度切换功能。


很简单的测试,你在任务2里设置一个断点,任务1发信号 os_send_signal(2); 看看会不会切换到任务2,——不会!



//

使用特权

评论回复
12
ningling_21|  楼主 | 2012-2-17 21:12 | 只看该作者
11# 刘前辈

又仔细一看,时间片轮转原来没关闭...

使用特权

评论回复
13
xjycug| | 2012-2-17 22:32 | 只看该作者
强烈建议楼主,如if(flag_bao==1||flag_uart==1) ,while(jh!=0&&jh!=4)  等括号内一定要加括号,确保优先级!!!写成if(  (flag_bao==1)  || (flag_uart==1) ) ,while(  (jh!=0)  &&  (jh!=4)  )  
在Keil中不能太信运算符默认优先级的!!

使用特权

评论回复
14
刘前辈| | 2012-2-18 10:39 | 只看该作者
12#
又仔细一看,时间片轮转原来没关闭...


   看来知道关闭时间片的程序员,是严谨的程序员(为数不多?)。

   时间片若不关闭,就要保证你的任务开销时间最好< 时间片值,——在时间片内核管理强制作用之前完成任务自我管理切换。还可以写为下面,以完成任务切换:

os_send_signal(2);
os_wait1(K_SIG);


这样写的话,注意的问题是后面谁来唤醒任务1 ?


//

使用特权

评论回复
15
ningling_21|  楼主 | 2012-2-18 13:23 | 只看该作者
os_send_signal(2);
是在任务1里;
os_wait1(K_SIG);
这个应该放在任务2里面,否则RTX自身就死循环了...

使用特权

评论回复
16
刘前辈| | 2012-2-18 14:17 | 只看该作者
本帖最后由 刘前辈 于 2012-2-18 20:31 编辑

呵呵,搞清楚概念:os_wait1(K_SIG);可以放在任何任务里。它的意思是:挂起自己,放弃CPU 给其它任务。
假定有2个任务1和2,那么显然2者循环调度是这样写:

void  task_1(void)  _task_ 1                              void  task_2(void)  _task_ 2
{                                                                        {
while(1)                                                             while(1)                                               
{                                                                        {
                                                                            os_wait1(K_SIG);    // 释放CPU,挂起,切换。
  // ……code1;                                                   
                                                                              // …… code 2 ;
os_send_signal(2);     //唤醒任务2                                          
                                                                            os_send_signal (1 );   // 唤醒任务1
os_wait1(K_SIG);     // 释放CPU,挂起,切换。
}                                                                          }

}                                                                          }


任务1必然先运行。

建议多看看《RTX51_Tiny 编程手册》和《 RTX51_Tiny应用指南 》;2本都有中文翻译版,别看电子版,不如纸版的学习效果明白。


、、

使用特权

评论回复
17
ningling_21|  楼主 | 2012-2-22 16:04 | 只看该作者
呵呵,搞清楚概念:os_wait1(K_SIG);可以放在任何任务里。它的意思是:挂起自己,放弃CPU 给其它任务。
假定有2个任务1和2,那么显然2者循环调度是这样写:

void  task_1(void)  _task_ 1                          ...
刘前辈 发表于 2012-2-18 14:17


经测试,如果按照楼上的写法,直接导致RTX51自身陷入死循环了...
因为等信号的任务根本就等不到信号...

使用特权

评论回复
18
wangc111| | 2012-2-22 16:29 | 只看该作者
耐着性子,学了点

使用特权

评论回复
19
haiyo| | 2012-2-23 11:09 | 只看该作者
头晕:dizzy:

使用特权

评论回复
20
zf_015820| | 2012-11-16 14:14 | 只看该作者
你如果在两个任务中,分别写条件去触发信号,就不会死循环 了

使用特权

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

本版积分规则

5013

主题

17713

帖子

51

粉丝