4922|7

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

如何设置任务的优先级最高 [复制链接]

各位大虾,小弟问个问题,希望大家指教!!
我现在做个网络通信的驱动,有一个任务rxFrameProcess,用来处理从网络上来的数据,然后根据数据类型做不同的处理,再把提取的数据载荷放到指定的数据链中。而用户的应用程序从数据链中读取处理过的数据。这个任务的内容大概是这样的:

sem_ID rxSem;
void rxFrameProcess()
{
       FOREVER
       {
               semTake(rxSem);
               /*处理数据*/
               semGive(rxSem);
       }
}

这个任务由初始化函数生成
int init()
{
     taskSpawn("rxFrameProcess", 90, 0x100, 2000, (FUNCPTR) rxFrameProcess, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
}
信号量由中断一个处理函数给出。也就是说,每次收到数据,中断处理函数给出信号量rxSem,然后rxFrameProcess就来处理数据。

但是现在有个问题:我的任务的优先级是90,但是如果上层的用户产生了一个更高优先级的任务,不停的读接收数据链

例如:
int readData()
{
       while(1)
       {
                /*读数据*/
                if(有数据)
                {
                      返回数据;
                         return ;
                }
                else
                     continue;
       }
}

那么这个rxFrameProcess任务即使获得了信号量也无法处理数据!!因为CPU被占用了!!

那我怎么才能合适的设置我的rxFrameProcess任务的优先级了,保证它比任何其他的应用进程都高了?难道设成1??

换句话说,就是我有个任务,如何才能保证这个任务的优先级不比其他应用任务的优先级低了??

谢谢!!

最新回复

这个我知道!但是我做得不是面对以太网的,而是面对FC网络的驱动。给别人的应用提供一个API。比如int msgRecv(char *pBuff). 万一别人编了死等的一个程序: recvMsg() {     int size;     char recvdData[1024];     while(1)     {         size=msgRecv(&recvdData);         if(size>=0)         break;     }       } 那么我下面的驱动处理程序不就死了么??  详情 回复 发表于 2009-2-19 22:05
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
小弟很急啊!难道这儿都没有高人么??
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
使用netjobAdd,添加到系统中。
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

4
 
多谢!!我来看看!
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

5
 
你的这个任务如果是用来处理网络接收数据的 ,那么优先级就不可设得太高,因为网络驱动本身有个“tnettask”的任务,是用来进行以太网数据接收的,优先级为50.那么你自己的任务优先级就必须要大于50.   


     你的这个 问题需要通过更改设计思路来解决 。你可以在rxFrameProcess里处理完数据后,在使用一个新的信号量来通知readData任务来接收你已经处理完的数据。   这样就避免readData中一直死查询,占用cpu时间。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

6
 
一般来说,建议用户的应用程序任务优先级不可以高于100的吧?
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

7
 
设的太高其他任务都没有办法正常运行了。
2楼和4楼说的都非常在理,我个人偏向于2楼的建议。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(中级)

8
 
这个我知道!但是我做得不是面对以太网的,而是面对FC网络的驱动。给别人的应用提供一个API。比如int msgRecv(char *pBuff).
万一别人编了死等的一个程序:
recvMsg()
{
    int size;
    char recvdData[1024];
    while(1)
    {
        size=msgRecv(&recvdData);
        if(size>=0)
        break;
    }
     
}

那么我下面的驱动处理程序不就死了么??
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表