打印

RTX51的任务会切换不了吗?

[复制链接]
6127|39
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ningling_21|  楼主 | 2011-12-22 15:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ayb_ice| | 2011-12-22 15:19 | 只看该作者
是tiny还是full呢
tiny本身不支持抢先任务切换,只能超时切换,或者主动放弃CPU切换任务

使用特权

评论回复
板凳
刘前辈| | 2011-12-22 18:11 | 只看该作者
开玩笑呢,信号就是用来唤醒等待任务进入就绪态的,能不切换成功?调度器是干什么的?
发送完SIG后,执行 os_switch_task( ); ( RTX51 Tiny_2.02版)。

使用特权

评论回复
地板
ningling_21|  楼主 | 2011-12-22 20:37 | 只看该作者
开玩笑呢,信号就是用来唤醒等待任务进入就绪态的,能不切换成功?调度器是干什么的?
发送完SIG后,执行 os_switch_task( ); ( RTX51 Tiny_2.02版)。
刘前辈 发表于 2011-12-22 18:11


没有看到有os_switch_task( ); 这个函数哦...
是RTX51 在定时器中断里自动切换的吧...

使用特权

评论回复
5
ningling_21|  楼主 | 2011-12-22 20:37 | 只看该作者
是tiny还是full呢
tiny本身不支持抢先任务切换,只能超时切换,或者主动放弃CPU切换任务
ayb_ice 发表于 2011-12-22 15:19


用的是 tiny 版的...
难道信号SIG没有?

使用特权

评论回复
6
刘前辈| | 2011-12-23 08:42 | 只看该作者
没有看到有os_switch_task( ); 这个函数哦...



呵呵,白学了?





、、

使用特权

评论回复
7
ayb_ice| | 2011-12-23 08:45 | 只看该作者
用的是 tiny 版的...
难道信号SIG没有?
ningling_21 发表于 2011-12-22 20:37

都说了TINY不支持抢先功能
必须当前任务放弃CPU(超时或主动放弃)才可能切换到其它任务
发信号给其它任务,也要其它任务是在等待信号才有用的
先仔细看帮助文档

使用特权

评论回复
8
刘前辈| | 2011-12-23 12:43 | 只看该作者
LZ 多半加了os_switch_task()也是仍然悲剧,其实不是RTX51不切换,而是你的发信号任务受升级程序影响,根本就没发出信号。

使用特权

评论回复
9
ningling_21|  楼主 | 2011-12-23 14:26 | 只看该作者
LZ 多半加了os_switch_task()也是仍然悲剧,其实不是RTX51不切换,而是你的发信号任务受升级程序影响,根本就没发出信号。
刘前辈 发表于 2011-12-23 12:43


程序中没有调用过os_switch_task()这个函数...

另。升级程序应该不会影响发送信号。因为在串口收到数据后就会发信号,等本任务结束使系统切换到下一个任务(等待信号的任务)。

问题出在:升级完成,MCU复位以后和上位机通信不上了...

使用特权

评论回复
10
ningling_21|  楼主 | 2011-12-23 14:27 | 只看该作者
呵呵,白学了?


90516


、、
刘前辈 发表于 2011-12-23 08:42


说错了,不是没看到,只是程序中没调用过这个函数。

使用特权

评论回复
11
刘前辈| | 2011-12-23 16:02 | 只看该作者
另。升级程序应该不会影响发送信号。因为在串口收到数据后就会发信号,等本任务结束使系统切换到下一个任务(等待信号的任务)。

问题出在:升级完成,MCU复位以后和上位机通信不上了...


呵呵,这是明显的逻辑因果关系:因为“在串口收到数据后就会发信号”,

所以由于“和上位机通信不上了...”——也就是“串口收不到到(上位机)数据了”,所以就“不会发信号”了。


、、

使用特权

评论回复
12
刘前辈| | 2011-12-24 09:31 | 只看该作者
处理(或证实)很简单,—— 任何时候,都是下位机从站先开机,待升级完成后,上位机主站再延迟最后开机。



、、

使用特权

评论回复
13
DownCloud| | 2011-12-24 22:42 | 只看该作者
、、

使用特权

评论回复
14
ningling_21|  楼主 | 2011-12-26 21:41 | 只看该作者
12# 刘前辈

mcu作为从机,收不到数据确实不发信号给串口数据处理任务的。

使用特权

评论回复
15
ningling_21|  楼主 | 2011-12-26 21:43 | 只看该作者
处理(或证实)很简单,—— 任何时候,都是下位机从站先开机,待升级完成后,上位机主站再延迟最后开机。



、、
刘前辈 发表于 2011-12-24 09:31


整个过程中,都是不断电的,MCU升级完成后自动复位.
所以:
“上位机主站再延迟最后开机” 无法实现。

使用特权

评论回复
16
ningling_21|  楼主 | 2011-12-27 09:03 | 只看该作者
贴上部分程序:
//主任务
void main_task _task_ 1
{
        while(1)
        {
                ......
                ......
                if(flag_uart==1)                //串口收到数据
                {
                        os_send_signal(2);        //给任务2发信号
                }
        }
}
//串口数据处理任务
void rece_task _task_ 2
{
        while(1)
        {
                .......
                send_char(0x0d);                // 串口发送数据
                .......
                flag_uart=0;
               
                os_wait1(K_SIG);                //退出该任务,等待信号
        }
}
//串口发送数据
void send_char(uchar g)                                //串口发送数据                       
{                                                                                                                         
        while(flag_send==1)                        //等待发送完成
        {
                os_wait1(K_SIG);                //退出该任务,等待信号
        }
        os_wait2(K_TMO,2);                        //延时
        SBUF0=g;                                //发送数据
        jyhe0+=g;                               
        flag_send=1;
}

使用特权

评论回复
17
ayb_ice| | 2011-12-27 09:15 | 只看该作者
你这程序结构看了有点晕啊
一个简单的串口用了这么多东西,一个简单队列就搞定了
任务2 有时可能会等待了两次K_SIG,但只看到一次发信号,这逻辑肯定有问题

使用特权

评论回复
18
ayb_ice| | 2011-12-27 09:17 | 只看该作者
而且清除flag_uart标志的逻辑也有点问题吧

使用特权

评论回复
19
ningling_21|  楼主 | 2011-12-27 14:12 | 只看该作者
你这程序结构看了有点晕啊
一个简单的串口用了这么多东西,一个简单队列就搞定了
任务2 有时可能会等待了两次K_SIG,但只看到一次发信号,这逻辑肯定有问题 ...
ayb_ice 发表于 2011-12-27 09:15


”等待两次信号“  这个我也奇怪,这是前一任电工写的程序。

当把发送数据里的等待信号部分去掉,修改发送子程序后,反而通信一次以后就再也通信不上了。

情况是:
平时都工作正常,在连续升级十几次过后(升级完成会自动复位),通信不上了。断电再上电,又能正常通信。

使用特权

评论回复
20
刘前辈| | 2011-12-27 21:45 | 只看该作者
当把发送数据里的等待信号部分去掉,修改发送子程序后,反而通信一次以后就再也通信不上了。


还真不能随便删,他有他的道理。——我来改一下,不一定行。试试看:

void main_task _task_ 1
{
        while(1)
        {
                ......
                ......
                if(flag_uart==1)                //串口收到数据
                {
                flag_uart=0;
                  os_send_signal(2);        //给任务2发信号
                }
        }
}
//串口数据处理任务
void rece_task _task_ 2
{
        while(1)
        {
                .......
                send_char(0x0d);                // 串口发送数据
                .......
                flag_uart=0;
               
                os_wait1(K_SIG);                //退出该任务,等待信号
        }
}
//串口发送数据
void send_char(uchar g)                                //串口发送数据                        
{                                                                                                                          
        while(flag_send==1)                        //等待发送完成
        {
          os_switch_task( );        
    //    os_wait1(K_SIG);                //退出该任务,等待信号
        }
        os_wait2(K_TMO,2);                        //延时
        SBUF0=g;                                //发送数据
        jyhe0+=g;                                
        flag_send=1;
}



//

使用特权

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

本版积分规则

5013

主题

17735

帖子

51

粉丝