原创 原代码实例:Select() in ZRTOS

2008-9-5 12:09 2497 2 4 分类: 汽车电子

1、问题综述


在一款车载记录仪中,车载仪即可以通过无线传输的方式,也可以用有线(J1939中的Transport Protecol)传输的方式与办公室软件联系(上传记录的数据、下传命令、修改参数等)。因此,车载仪中的通讯软件模块将同时与两个以上通讯介质联络。ZRTOS 中 Select()API 将很好地handle这种情况。以下是C代码:


#define COM_J1939    0
#define COM_WIRELESS 1
#define _SEL_TIME_OUT       3000 //30s time out 


static fd_set com_ch; //container for select
static RTOS_FD_TYPE com_in[2];


void com_init(void) //communication initialization
{   
  current_COM = COM_DISPATCH_LOGON;
  RTOS_FD_ZERO(&com_ch); //zero file descriptor - select() usage container


  com_in[COM_J1939] = open(J1939_COM_CH); //open J1939 Transport protecol com channel;
  RTOS_FD_SET(getFds(com_in[COM_J1939]), &com_ch);//put J1939 com channel into select() usage container
  com_in[COM_WIRELESS] = open(WIRELESS_COM_CH);//open wireless com channel;
  RTOS_FD_SET(getFds(com_in[COM_WIRELESS]), &com_ch);//put wireless com channel into select usage container
      
  com_process.sem = rtos_semBCreate(0, SEM_EMPTY); //greate a semaphone
  
  rtos_taskSpawn(COM_TASK_PRORITY-2, (RTOS_FUNCPTR) com_tasks, 0);//spawn a task to handle communication channels
  rtos_taskSpawn(COM_TASK_PRORITY-2, (RTOS_FUNCPTR) process_com_message, 0);//spawn a task to process communication messages


 }


static void com_tasks(void) //the task to handle communication channels
{
  long sel, size;


   
  sel = select(&com_ch, _SEL_TIME_OUT);  //select() with 30 s time out


#define _5MIN_TIME_OUT (10)   //if a cmd did not finish in 5 min. it was a fault cmd, get out any way
                               //if the connection was a j1939, the time out is 5 sec.
  
  
  if (sel == 0) { //time out
//do nothing or may use as a counter timer, when the number of the timeout reach a critical value, do something...


  } else {  //COM available
    if (RTOS_FD_ISSET(getFds(com_in[COM_J1939]), &com_ch)) { //J1939 chaneel active
      size = read(com_in[COM_J1939], (char *) com_receive, COM_RCV_BUFFER_SIZE);
    } else {  //wireless
      size = read(com_in[COM_WIRELESS], (char *) com_receive, COM_RCV_BUFFER_SIZE);
    }
    if (size > 0) {
      rtos_semGive(com_process.sem); //wake up process-communication-message task 
    }   


  }
  RTOS_FD_ZERO(&com_ch);//zero the select() container
}


static void process_com_message(void)//process-communication-message task 
{     
  rtos_semTake(com_process.sem, WAIT_FOREVER); 


//your process code here ...


//...


}


2、结论


ZRTOS中的select() 函数的使用方式和效果与vxWorks、UNIX基本相同。

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户461316 2008-9-6 09:49

加油!!!!

用户3266 2008-9-5 14:00

博主要努力写噢,以后常来学习
相关推荐阅读
用户1204612 2009-01-07 04:43
再谈谈配置(Configuration)的重要性
1、华尔街的数字<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />在过去的12个月中,...
用户1204612 2009-01-05 00:59
ZRTOS 应用实例
也许大家有疑问ZRTOS真的好用吗?有没有已知或未知的bug呢?可以负责地讲只要正确地使用,ZRTOS is bug-free. 现在向大家展示一个ZRTOS的应用实例。here is the sou...
用户1204612 2008-12-20 04:09
ZRTOS 的系统配置(Configuration)
ZRTOS 的系统配置(Configuration)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:offic...
用户1204612 2008-12-01 23:20
谈谈AUTOSAR
AUTOSAR是由欧日的主要汽车生产商和一些芯片制造商推出的产业标准或操作系统。其主要动机是为了应对日益复杂的汽车电子系统:提高系统的灵活性;增加系统的更新和升级性能;改善系统的可靠性和稳定性;在设计...
用户1204612 2008-10-12 08:13
ZRTOS的应用篇(2)
ZRTOS的应用篇(2)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />前几天老四看...
用户1204612 2008-09-17 22:26
原代码:ZRTOS的任务篇(2)SPI
1、问题综述:SPI具有连线少,速度较异步串口(UART)快,一个控制口可接多个SPI设备等优点,因此在嵌入式系统中得到广泛的应用。然而在“大循环”或某些RTOS中,对SPI编程往往会遇到代码效率低、...
EE直播间
更多
我要评论
2
2
关闭 站长推荐上一条 /3 下一条