ÈÎÎñ¼äͬ²½ÓëͨÐÅÖ®¹ÜµÀ
VxWorksÌṩÁËÒ»ÖÖÀàËÆÏûÏ¢¶ÓÁеÄÈÎÎñ¼äÊý¾ÝͨÐŵĻúÖÆ----¹ÜµÀ¡£¹ÜµÀµÄ×÷ÓøúÏûÏ¢¶ÓÁм¸ºõÍêȫһÖ£¬¾ÍÊÇ¿ÉÒÔ°ïÖú°ÑÊý¾Ý´ÓÒ»¸öÈÎÎñ·¢Ë͸øÁíÒ»¸öÈÎÎñ£¬µ«Êǹ¦ÄÜÀàËÆ£¬Ê¹Ó÷½Ê½È´½ØÈ»²»Í¬¡£¹ÜµÀÊôÓÚÒ»ÖÖÐéÄâµÄI/OÉ豸£¬ËùÒÔËüµÄÏà¹ØAPI¸úͳһI/O·ÃÎʽӿÚÍêȫһÖ£¬±ÈÈçopen£¬close£¬read£¬writeµÈ¡£Ò²¾ÍÊÇ˵ËüÌṩÁËÒ»×éͨÓõÄI/O²Ù×÷½Ó¿Ú£¬¶ÔʹÓÃÕßÀ´Ëµ·Ç³£·½±ã¡£
ÏÂÃæ¿ÉÒÔ¿´Ò»¶Î¹ÜµÀʹÓõĴúÂ룺
// ´´½¨¹ÜµÀÐéÄâI/OÉ豸 pipeDevCreate("/pipe/try1", 10, 100); // ´ò¿ª¸ÃÉ豸 int fd = open ("/pipe/try1", O_RDWR, 0); // Ïò¹ÜµÀдÈëÊý¾Ý write (fd, (char*)&inData, sizeof(inData)); // ´Ó¹ÜµÀ¶ÁÈ¡Êý¾Ý int len = read (fd, (char*)&outData, sizeof(outData)); |
´ÓÈçÉÏ´úÂë¿ÉÒÔ¿´³ö£¬´´½¨Íê¹ÜµÀºóµÄ´¦ÀíÍêÈ«¸úͨÓÃI/O½Ó¿ÚµÄʹÓÃÊÇÍêÈ«ÏàͬµÄ£¬¶ÔC/C++³ÌÐòÔÀ´Ëµ¼¸ºõûÓжîÍâµÄѧϰ³É±¾¡£ËùÒÔÄã·ÃÎʹܵÀ¿ÉÒÔ¸úÆäËûI/O·ÃÎʵĴ¦ÀíÒ»Ñù£¬ÓÅ»¯ÁË´úÂëµÄͨÓÃÐÔ¡£Í¬Ê±£¬Ê¹ÓùܵÀ»¹´øÀ´ÁíÒ»Öֺô¦£¬ËüÖ§³Ö¶à·I/O¸´ÓÃ----select¡£´ó¼ÒÖªµÀselectÖ§³Ö¾ø´ó¶àÊýµÄÒì²½I/OÉ豸µÄ²Ù×÷£¬°üÀ¨Socket£¬´®ÐÐÉ豸µÈ¡£ËùÒÔʹÓÃselect¿ÉÒÔʹһ¸öÈÎÎñͬʱ¼àÌý¶à×鲻ͬµÄI/OÉ豸£¬´ó´óÌá¸ß³ÌÐòÐÔÄÜ¡£¹ØÓÚselect£¬´ó¼ÒÒ²¿ÉÒԲο¼Îҵġ¶·þÎñÆ÷Ä£ÐÍ·ÖÎöÓëÑéÖ¤¡·ÖжԶà·I/O¸´ÓõÄÃèÊö¡£
¿´µ½ÕâÀÓÐÈË»á˵£¬ÄǹܵÀÔÚʹÓú͹¦ÄÜÉϲ»ÊÇÍêʤÏûÏ¢¶ÓÁÐÂð£¬ÊDz»ÊÇ´ó¼Ò¶¼Ó¦¸ÃʹÓùܵÀ°¡£¿µ±È»²»ÊÇ£¬ÆäʵÁ½Õ߸÷ÓÐÌØµã£¬Ç°ÎÄÖÐÒ²ÓÐÌáµ½£¬ÏûÏ¢¶ÓÁÐÖ§³ÖÔÚ¶ÁºÍд²Ù×÷ʱÉèÖó¬Ê±Ê±¼ä£¬Í¬Ê±»¹Ö§³ÖÉèÖÃÏûÏ¢ÀàÐÍ£¨URGENT»¹ÊÇNORMAL£©µÈ£¬¶ø¹ÜµÀ²¢²»Ö§³ÖÕâЩ£¬ËüÖ»ÊÇÖ§³ÖͨÓÃI/O²Ù×÷Ëù¾ßÓеĽӿÚÐÎʽ¡£ËùÒÔ¾ßÌåÈçºÎÑ¡Ôñ»¹ÊÇ¿´Êµ¼ÊµÄÓ¦Óá£
×ܵÄÀ´Ëµ£¬ÏûÏ¢¶ÓÁиü·ûºÏͨÓõÄÈÎÎñ¼äͨÐŵÄʹÓÃϰ¹ß£¬Ò²¸üÈÝÒ׿ØÖÆ£¬¶øµ±ÐèҪͨ¹ý¶à·I/O¸´ÓÃÀ´ÓÅ»¯³ÌÐò´¦Àíʱ£¬Ôò¿ÉÒÔ¿¼ÂÇʹÓùܵÀ¡£
ÈÎÎñ¼äͬ²½ÓëͨÐÅ֮ʼþ
´ÓVxWorks 5.5¿ªÊ¼£¬ÌṩÁËеÄÈÎÎñ¼äͬ²½Í¨ÐŵĻúÖÆ----ʼþ£¬Ê¼þ¿ÉÓÃÓÚÈÎÎñºÍÖжϷþÎñ³ÌÐòISRÖ®¼ä¡¢ÈÎÎñºÍÈÎÎñÖ®¼ä¡¢ÈÎÎñºÍVxWorks×ÊÔ´Ö®¼ä½øÐÐͨÐÅ¡£
ÈÎÎñÓú¯ÊýeventReceive()À´½ÓÊÕËü¹ØÐĵÄʼþ£¬ÓÃeventSend()À´ÏòÁíÒ»¸öÈÎÎñ·¢ËÍʼþ¡££¨ÊÇ·ñ¿´ËƼòµ¥?)
ÏÈÀ´¿´µÚÒ»¸öÀý×Ó£º
void eventRoute1(void* param) { int task_id = (int)param; eventSend(task_id , VXEV01); } void tryEvent() { int id = taskIdSelf(); taskSpawn("vxEvent1", 150, VX_FP_TASK, 30000, (FUNCPTR)eventRoute1, id,0,0,0,0,0,0,0,0,0 ); eventReceive(VXEV01, EVENTS_WAIT_ALL, WAIT_FOREVER, 0); } |
ÔÚtryEventÖÐÆô¶¯Ò»¸öÈÎÎñ£¬È»ºóµ÷ÓÃeventReceiveͨ¹ýÉèÖÃEVENTS_WAIT_ALLÀ´µÈ´ýVXEV01ʼþµÄ·¢Éú£¬×ÓÈÎÎñÖе÷ÓÃeventSendÏò³õʼÈÎÎñ·¢ËÍʼþVXEV01£¬´Ó¶ø´¥·¢³õʼÈÎÎñ¼ÌÐøÖ´ÐС£
´ÓÕâ¸öÀý×Ó£¬ºÜ¶àÈËÒ²Ðí»á¾õµÃʼþ¸úÐźÅÁ¿¹¦ÄÜÒ»Ñù£¬Ã»ÓÐÌ«¶àÒâÒå¡£ÆäʵÉÏÃæÌåÏֵŦÄÜÖ»ÊÇʼþµÄ±ùɽһ½Ç£¬ÈÃÎÒÃÇÂýÂýÀ´Ò»¿úȫò°É¡£
ÄÇô£¬Ê¼þÓÐÄÄÐ©ÌØµãÄØ£¿
µÚÒ»£¬´ÓÉÏÃæµÄÀý×ÓÒѾ¿ÉÒÔ¿´³ö£¬Ê¹ÓÃʼþʱ²»ÐèÒª´´½¨ÈκζÔÏó£¬ËùÒÔËüÊÇÒ»ÖÖ¸üÇáÁ¿¼¶µÄͬ²½Í¨ÐÅ»úÖÆ¡£ÒòΪÿһ¸öÈÎÎñ¶¼ÓÐÒ»¸ö32λʼþ¼Ä´æÆ÷£¬ÆäÖиß8λÓÉVxWorksϵͳ±£Áô£¬¿ª·¢Õß¿ÉÒÔʹÓõÍ24루VXEV01~VXEV24£©£¬Ã¿Ò»Î»±íʾһÖÖʼþ¡£
µÚ¶þ£¬Ê¹ÓÃʼþ¿ÉÒԵȴý¶à¸öʼþµÄ·¢Éú£¬ÕâÀïµÄ¶à¸öʼþ·¢ÉúµÄ¹ØÏµ£¬¿ÉÒÔÊÇ¡°Ó롱Ҳ¿ÉÒÔÊÇ¡°»ò¡±£¬ÔÚeventReceive·½·¨ÖпÉÒÔÖ¸¶¨EVENTS_WAIT_ANY»òEVENTS_WAIT_ALL£¬±ÈÈçµÈ´ýVXEV01»òVXEV02Ö®Ò»µÄ·¢Éú:
eventReceive(VXEV01 | VXEV02, EVENTS_WAIT_ANY, WAIT_FOREVER, 0); |
¸öÈËÈÏΪÕâÊǷdz£ÓÐÓõÄÒ»µã£¬±Ï¾¹Èç¹ûÒª×Ô¼ºÊµÏÖ¶àʼþ½áºÏ²¢¿É¿ØÖƳ¬Ê±Ê±¼äµÄ»°£¬¿ÉÒÔ˵²¢·ÇÄÇô¼òµ¥£¬¶øÇÒÐÔÄÜÒ²»áÓÐÎÊÌâ¡£
µÚÈý£¬³ýÁËÉÏÊöÀý×ÓÖÐeventReceiveºÍeventSendµÄʹÓÃÍ⣬ʼþ»¹¿ÉÓÃÓÚÈÎÎñ¸úVxWorks×ÊÔ´Ö®¼ä½øÐÐͨÐÅ£¬ÕâÀïËùνµÄ×ÊÔ´ÓÐÐźÅÁ¿£¬ÏûÏ¢¶ÓÁеȡ£
±ÈÈçÔÙ¿´µÚ¶þ¸öÀý×Ó£¨¼ÙÉèÒÑ´´½¨ÁËsem_ev1ºÍsem_ev2Á½¸öÐźÅÁ¿£©£º
void eventRoute1(void* param) { semGive(sem_ev1); } void eventRoute2(void* param) { semGive(sem_ev2); } void tryEvent() { semEvStart(sem_ev1, VXEV01, EVENTS_SEND_ONCE); semEvStart(sem_ev2, VXEV02, EVENTS_SEND_ONCE); taskSpawn("vxEvent1", 150, VX_FP_TASK, 30000, (FUNCPTR)eventRoute1, 0,0,0,0,0,0,0,0,0,0 ); taskSpawn("vxEvent2", 150, VX_FP_TASK, 30000, (FUNCPTR)eventRoute2, 0,0,0,0,0,0,0,0,0,0 ); eventReceive(VXEV01 | VXEV02, EVENTS_WAIT_ALL, WAIT_FOREVER, 0); semEvStop(sem_ev1); semEvStop(sem_ev2); } |
¸ú×ÊԴͨÐÅ£¬ÐèÒª°Ñ¶ÔÓ¦×ÊÔ´×¢²áµ½Ìض¨Ê¼þ£¬ÈçÉÏÀýÖÐÊÇͨ¹ýsemEvStart°ÑÐźÅÁ¿sem_ev1ºÍsem_ev2·Ö±ð×¢²áµ½Ê¼þVXEV01ºÍVXEV02£¬È»ºósemGiveÐźÅÁ¿±»ÊÍ·ÅÇÒ¿ÉÓÃʱ£¬¶ÔӦע²áµÄʼþ»á±»´¥·¢¡£
µÚËÄ£¬Ç°ÃæËµµ½semGiveÐźÅÁ¿±»ÊÍ·ÅÇÒ¿ÉÓÃʱ£¬¶ÔӦע²áµÄʼþ»á±»´¥·¢£¬ÕâÀïËùν¿ÉÓõĺ¬ÒåÊÇ£¬semGiveÊÍ·ÅÐźÅÁ¿Í¬Ê±Ã»ÓÐÆäËûÈÎÎñÕýÔÚËø¶¨¸Ã×ÊÔ´£¬Ò²¾ÍÊǸÃʱ¼äµã¸Ã×ÊÔ´¿ÉÓÃʱ£¬²Å»á´¥·¢Ê¼þ¡£µ«²»Äܱ£Ö¤¸Ã×ÊÔ´ÔÚʼþ±»´¥·¢ºó»¹¿ÉÓã¬ÒòΪºóÐøÓпÉÄÜÓÖ±»ÆäËûÈÎÎñËø¶¨¡£
µÚÎ壬Èç¹ûÏà¹Ø±»×¢²áµ½Ê¼þµÄ×ÊÔ´±»É¾³ýʱ£¬Í¨¹ýeventReceiveµÈ´ý¸ÃʼþµÄÈÎÎñ»á×Ô¶¯±»´¥·¢£¬Ò²¾ÍÊÇ˵semDeleteºÍmsgQDelete»á´¥·¢¸Ã×ÊÔ´×¢²á¹ýʼþ¡£µ«ÊÇÐèҪעÒâµÄÊÇ£¬µ±µ÷ÓÃsemDeleteʱ£¬ÈÎÎñÖ´ÐÐÓÚsemEvStartºÍeventReceiveÖ®¼äµÄ»°£¬ÔòºóÐøeventReceive»á±»×èÈû¡£
×ÜÉÏËùÊö£¬VxWorksÖУ¬Ê¼þÌṩÁ˷dz£·á¸»µÄ¹¦ÄÜ£¬ÔÚʵ¼ÊÓ¦Óó¡¾°ÖÐËüµÄÒ»Ð©ÌØÐÔ¿ÉÒÔʹºÜ¶à¸´ÔÓµÄÊÂÇé±äµÃ¼«Æä¼òµ¥¡£
ÈÎÎñ¼äͬ²½ÓëͨÐÅÖ®ÐźÅ
VxWorksÖеÄÐźÅÊÇ´ÓPOSIXÑØÓùýÀ´µÄ¸ÅÄÈç¹ûÄãÊìϤLinuxϵÄsignal£¬ÄÇô¼¸ºõ¾ÍÊÇÒ»»ØÊ¡£ÐźŸúÐźÅÁ¿£¬ÄÇÍêÈ«ÊÇÁ½»ØÊ£¬ÐźÅÓеãÀàËÆÊ¼þ£¬²»¹ýʼþ½Ó¿ÚÊÇͬ²½µÄ£¬¶øÐźŴ¦ÀíÊÇÒì²½µÄ£¬ËùÒÔÆäʵÐźŸüÏñÖжϣ¬»ò¿ÉÒÔ³ÆÎªÈíÖжϡ£
ÏÈ¿´¸ö¼òµ¥µÄÀý×Ó£º
void signalRoute1(int sig) { logMsg("signalRoute1 signal id: %d\n", sig,0,0,0,0,0); } void trySignal() { signal(SIGBUS, signalRoute1); raise(SIGBUS); } |
ÔÚÕâ¸öÀý×ÓÖУ¬ÏÈͨ¹ýsignal·½·¨£¬°ó¶¨ÐźÅSIGBUSµÄ´¦Àí·½·¨signalRoute1£¬È»ºóͨ¹ýraiseÏòµ±Ç°ÈÎÎñ·¢ËÍÐźţ¬ÐźŴ¦Àíº¯Êý±»Ö´ÐС£
µÚÒ»¸ö¸ÅÄ°ó¶¨µÄÐźŴ¦Àíº¯ÊýÊÇÔÚÄÄÔËÐУ¬ºǫ́ÐÂÈÎÎñÖУ¿µ±Ç°ÈÎÎñÖУ¿ÏµÍ³ÌØÊâÈÎÎñÖУ¿´ð°¸ÊÇ»áÔÚÐźÅÄ¿±êÈÎÎñµÄÉÏÏÂÎÄÖÐÔËÐУ¬ËùÒÔ¸ÃÀý×ÓÖÐÒòΪraiseÊÇÏòµ±Ç°ÈÎÎñ·¢ËÍÐźţ¬ËùÒÔÖ®ºó»á¹ÒÆðµ±Ç°ÈÎÎñµÄÖ´ÐУ¬µ«ÈÔ¾ÉÔÚ±¾ÈÎÎñµÄÉÏÏÂÎÄÖÐÏìÓ¦signalRoute1¡£
ÔÙ¿´Ò»¸öÀý×Ó£º
void signalRoute2(int sig) { logMsg("signalRoute2 sig id: %d\n", sig,0,0,0,0,0); } void taskRoute(void* param) { int task_id = (int)param; kill(task_id, 0x10); } void trySignal() { int id = taskIdSelf(); signal(0x10, signalRoute2); taskSpawn("vxSignal", 150, VX_FP_TASK, 30000, (FUNCPTR)taskRoute, id,0,0,0,0,0,0,0,0,0 ); } |
ÏÈ˵Ã÷Ï£¬kill¸úrasiseÒ»Ñù¶¼ÊǸøÈÎÎñ·¢ËÍÐźţ¬µ«rasiseÖ»Äܸøµ±Ç°ÈÎÎñ£¬¶økill¿ÉÒÔÖ¸¶¨ÈÎÎñ·¢ËÍ£¬Ö¸¶¨ÈÎÎñ»á±»¹ÒÆð£¬¶øÐźŴ¦Àí¾Í»áÔÚÈÎÎñidÖ¸¶¨ÈÎÎñµÄÉÏÏÂÎÄÖÐÔËÐС£
µÚ¶þ¸ö¸ÅÄ²»ÄÜÏòÄÚºËÈÎÎñ·¢ËÍÐźţ¬¿ÉÒÔ¸øÈÎÎñ±¾Éí£¬ÏµÍ³publicµÄÈÎÎñ»òϵͳÈÎºÎÆäËû½ø³Ì£¨6.x¿ªÊ¼Ö§³Öprocess£©·¢ËÍÐźš£
µÚÈý¸ö¸ÅÄϵͳÖÐÓÐ31¸ö¿ÉÓõÄÐźţ¨1~31£©£¬Ã¿¸öÐźŶ¼ÓÐĬÈϵĺ¬ÒåºÍ´¦Àí£¬µ«Óû§¿ÉÒÔÐÞ¸ÄĬÈϵÄÉ趨¡£
µÚËĸö¸ÅÄӦ¸ÃÔÚʲôʱºòÓÃÐźţ¿Ðźű¾ÉíÒ²¿ÉÒԺܷ½±ãµÄ´ï³ÉÈÎÎñ¼äµÄͨÐÅ£¬µ«ÊÇÕý³£Çé¿öÏÂÎÒÃÇÓ¦¸Ã¾¡Á¿ÉÙÓÃÐźţ¬ÎªÊ²Ã´£¿ÒòΪÐÅºÅ»áÆÆ»µ¼ÈÓд¦ÀíµÄÓÅÏȼ¶¿ØÖÆ¡£ÒòΪÐźÅÊÇÒì²½´¦ÀíµÄ£¬ËùÒÔºÜÄѱÜÃâÔÚÐźŴ¦Àíµ¼ÖÂÄ¿±êÈÎÎñ¹ÒÆðʱ£¬ÊÇ·ñ»áÒòΪ¸ÃÈÎÎñËø¶¨ÁËij×ÔÔ¸µ¼ÖÂÕý³£´¦ÀíÂß¼±»ÆÆ»µ£¬Í¨Ë×µã˵¾ÍÊÇÐźŴ¦ÀíºÜ¿ÉÄÜ×èÈûÕý³£µÄÂß¼¡£ËùÒÔÒ»°ãÖ»ÓÐÔÚ´íÎó´¦Àí»òÕßÒì³£µÈÓÅÏȼ¶Ïà¶ÔºÜ¸ßµÄ´¦ÀíÉÏʹÓÃÐźš£
µÚÎå¸ö¸ÅÄ¼´Ê¹ÈÎÎñ´¦ÓÚ¹ÒÆð״̬£¨±ÈÈçµÈ´ýijÐźÅÁ¿£©£¬·¢ËÍÐźÅʱ»¹ÊÇ¿ÉÒÔ´¥·¢¸ÃÈÎÎñ¡£
µÚÁù¸ö¸ÅÄÐźŴ¦Àíº¯ÊýÓкÎÐèҪעÒâµÄ£¿ÒòΪµÚËĵãÖÐÌáµ½µÄÎÊÌ⣬ËùÒÔÐźŴ¦Àíº¯ÊýÓ¦¸Ã¾¡Á¿±£Ö¤´¦Àí¶ÌС£¬¾«¼ò£¬²»Ê¹ÓûᵼÖÂ×èÈûµÄ´¦Àí¡£ÆäʵÓеãÀàËÆÖжϵĴ¦Àí£¬¹ØÓÚÕâµã¿ÉÒԲο¼ÎÒÁíһƪÎÄÕ£º¡¶¡¾VxWorksϵÁС¿ÖжϷþÎñ³ÌÐòÖÐÄÄЩ¿ÉÒÔ×öÄÄЩ²»¿ÉÒÔ×ö¡·¡£
×ܽáһϣ¬¶ÔÓÚ³£¹æµÄÈÎÎñ¼äͨÐÅ£¬ÍùÍùǰ¼¸ÆªÖÐÌáµ½µÄ¼¸ÖÖ·½Ê½¸üºÏÊÊ£¬¸üͨÓ㬸ü°²È«¡£¶ø¶ÔÓÚÐźţ¬Ò»°ã¸ü¶àµÄ±»Ê¹ÓÃÔÚ´íÎó´¦Àí»òÒì³£ÖУ¬×ÜÖ®»¹ÊÇÉ÷Óᣠ|