|
µäÐÍRTOSÓ¦ÓÃI/O¼Ü¹¹
ÏÂÃæÃèÊöÒ»¸öµäÐ͵ÄI/OÅäÖÃ(½ö½öÊäÈë)ºÍËüÏòÖ÷ÒªÓ¦ÓóÌÐò´«µÝÊý¾ÝµÄ·¾¶´¦Àí¹ý³ÌÒÀ´ÎÈçÏÂ:
* Ò»¸öÓ²¼þÖжϴ¥·¢Ò»¸öÖжϷþÎñÀý³ÌµÄÖ´ÐС£
* ÖжϷþÎñÀý³Ì×ö»ù±¾µÄ´¦ÀíºÍÍê³É±¾µØµÄÊäÈë²Ù×÷,»òÕßÈÃRTOSµ÷¶ÈÑÓʱµÄ´¦Àí¡£ÔÚһЩÇé¿öÏÂ,ÑÓʱ´¦Àí¹ý³ÌÓÉÔÚLinuxÀïÃæ±»½Ð×öÓû§½ø³ÌÀ´´¦Àí,ÔÚÕâÀï¾ÍÊÇͨ³£µÄRTOSÈÎÎñ¡£
* ÎÞÂÛÔÚºÎʱºÎµØ»ñµÃÊý¾Ý(ÖжϷþÎñÀý³Ì»òÕßÑÓʱÇл»),×¼±¸ºÃµÄÊý¾Ý±»·Å½ø¶ÓÁÐ(RTOSÖжϷþÎñÀý³ÌÄܹ»·ÃÎÊÓ¦ÓóÌÐò¶ÓÁÐͨ¹ýÓ¦ÓóÌÐò½Ó¿Ú(API)ºÍÆäËü½ø³Ì¼äͨÐÅ (?IPC),Çë¿´ÏÂÃæµÄAPI±í)¡£
* Ò»¸ö»òÕß¶à¸öÓ¦ÓÃÈÎÎñÈ»ºó´Ó¶ÓÁжÁÏûÏ¢,À´È¡³öÊý¾Ý¡£
ÔÚ´«Í³µÄRTOSºÍLinuxÖ®¼äµÄµäÐÍI/OµÄ±È½ÏÊä³ö³£³£ÓÉÀàËÆµÄ»úÖÆÀ´Íê³É¡£Ìæ´úʹÓÃwrite()»òÕßÏàËÆµÄϵͳµ÷ÓÃ, Ò»¸ö»òÕß¶à¸öRTOSÓ¦ÓóÌÐòÈÎÎñ,°Ñ×¼±¸ºÃµÄÊý¾Ý·Å½ø¶ÓÁС£¶ÓÁÐÖеÄÊý¾ÝÓÉÒÔϹý³ÌÈ¡³ö:Ò»¸öI/O³ÌÐò»òÕßÏìÓ¦”×¼±¸ºÃ·¢ËÍ”ÖжϵÄÖжϷþÎñÀý³Ì,Ò»¸öϵͳʱÖÓ,»òÕ߯äËü×èÈûÔÚ»ñÈ¡¶ÓÁÐÖеÄÓ¦ÓÃÈÎÎñ,È»ºóÖ±½ÓÖ´ÐÐI/O²Ù×÷(¿ÉÒÔÊÇÂÖѯ,Ò²¿ÉÒÔÊÇͨ¹ý DMA)¡£
°ÑRTOS I/O Ó³Éä½ø Linux
ÉÏÃæÃèÊöµÄ»ùÓÚ¶ÓÁеÄÉú²ú/Ïû·ÑI/OÄ£ÐÍ,½ö½öÊǺܶàÖÖÔÚ´«Í³Éè¼ÆÖÐËù²ÉÓõÄÌØ±ð·½·¨Ö®Ò»¡£ÈÃÎÒÃǼÌÐøÓÃÕâ¸öÖ±½ÓµÄÀý×Ó,À´ÌÖÂÛ¼¸ÖÖÔÚǶÈëʽLinuxϵÄʵÏÖ:
´ó¹æÄ£ÒÆÖ²µ½Óû§¿Õ¼ä
¶ÔÓÚÃãÇ¿Á˽âLinuxÉ豸Çý¶¯Éè¼ÆÏ¸½Ú,»òÕ߷dz£´ÒæµÄ¿ª·¢Õß,¿ÉÄܰѴó¶àÊýÕâÑù»ùÓÚ¶ÓÁÐÉè¼Æ³ÌÐòÍêÕûÎÞȱµØÒÆÖ²µ½Óû§¿Õ¼ä¡£ÔÚÕâÖÖÇý¶¯³ÌÐòÓ³ÉäÅäÖÃÖÐ,ÄÚ´æÓ³ÉäµÄÎïÀíI/O¿Úͨ¹ýº¯Êýmmap()ÌṩµÄÖ¸Õë¿ÉÒÔÔÚÓû§¿Õ¼ä²Ù×÷¡£
#include <sys/mman¡£h>
#define REG_SIZE 0x4 /* device register size */
#define REG_OFFSET 0xFA400000
/* physical address of device */
void *mem_ptr; /* de-reference for memory-mapped access */
int fd;
fd=open("/dev/mem",O_RDWR); /* open physical memory (must be root) */
mem_ptr = mmap((void *)0x0, REG_AREA_SIZE, PROT_READ+PROT_WRITE,
MAP_SHARED, fd, REG_OFFSET);
/* actual call to mmap() */
|
Ò»¸ö»ùÓÚ½ø³ÌµÄÓû§Ï߳̽øÐÐÓë»ùÓÚRTOSµÄÖжϷþÎñÀý³Ì»òÕßÑÓʱÈÎÎñÒ»ÑùµÄ²Ù×÷,È»ºóʹÓÃSVR4½ø³Ì¼äͨÐź¯Êýmsgsnd()°ÑÏûÏ¢·Å½ø¶ÓÁÐ,µÈ´ý±»ÁíÒ»¸ö±¾µØÏ̻߳òÕßÁíÒ»¸ö½ø³ÌÀûÓú¯Êýmsgrcv()À´»ñÈ¡¡£ÕâÖÖ¿ìËÙ”ÔàµÄ” ´¦Àí·½·¨ÊǺõÄÔÐÍ,ͬʱ¶ÔÓÚ½¨Á¢¿É·¢²¼ÐÍ´úÂë´øÀ´Á˾޴óµÄÌôÕ½¡£Ê×ÏÈÖØÒªµÄÊÇÐèÒªÔÚÓû§¿Õ¼äɨÃèÖжϡ£ÏóDOS·ÂÕæ(DOSEMU)ÏîÄ¿Ìṩ»ùÓÚÐźŵĴøSIG(SillyÖжϷ¢ÉúÆ÷)ÖжÏI/O,µ«ÊÇÓû§¿Õ¼äµÄÖжϴ¦Àí¹ý³Ì·Ç³£Âý(ºÁÃëÁ¿¼¶ÖжÏÑÓʱ,ËùÌæ´úµÄ»ùÓÚÄں˵ÄÖжϷþÎñÀý³ÌÖжÏÑÓʱΪÊýʮ΢Ãë)¡£¸ü½øÒ»²½½²,ÔÚÓû§¿Õ¼äµÄÇл»µ÷¶È²»Äܱ£Ö¤Óû§¿Õ¼äµÄI/O Ïß³Ì100%µÄ¼°Ê±Ö´ÐÐ,¼´Ê¹²ÉÓÿÉÇÀÕ¼LinuxÄں˺Íʵʱµ÷¶È²ßÂÔ¡£
ΪʹÓÃLinuxÇý¶¯³ÌÐòÖØÐÂÉè¼ÆÐ´ÖÁÉÙÒ»¸ö¼òµ¥µÄLinuxÇý¶¯³ÌÐòÔÚÄں˲ã´Î´¦ÀíÖжϹý³Ì,¸üΪ¿ÉÈ¡¡£Ò»¸ö»ù±¾µÄ×Ö·ûÇý¶¯³ÌÐò»òÕß¿éÇý¶¯³ÌÐò,Äܹ»ÔÚ”Éϰ벿”Ö±½ÓɨÃèÓ¦ÓÃÖжÏÊý¾Ý,»òÕßÑÓʱµ½ÈÎÎñ¶ÓÁÐÈ¥ºóÐø´¦Àí, ÈÎÎñ¶ÓÁÐÊÇÄÚºËÏ̻߳òÕßÔÚ2¡£6ÄÚºËÀïΪÐµĹ¤×÷¶ÓÁÐ(ϰ벿)»úÖÆ¡£Ò»¸ö»òÕß¶à¸öÓ¦ÓÃÏß³Ì/½ø³ÌÄܹ»´ò¿ªÉ豸ȻºóÖ´ÐÐͬʱµÄ¶Á²Ù×÷,ÕýÏñRTOSÓ¦ÓÃͬʱ¶ÓÁнÓÊܵ÷ÓÃÒ»Ñù¡£Òª×¢ÒâµÄÊÇ,ÕâÖÖ·½·¨°ÑÐèÒªÖÁÉټǼI/OÏß³ÌʹÓÃÉ豸¶Á»î¶¯µÄ¿ªÏú,Ìæ´ú¶ÓÁнÓÊܲÙ×÷¡£
±£ÁôÒ»¸öRTOS»ùÓÚ¶ÓÁеÄI/O¼Ü¹¹
ΪÁ˼õÐ¡ÒÆÖ²µ½Ç¶ÈëʽLinux ºóµÄÓ°Ïì,ÄãÒ²¿ÉÒÔÔÚÔÀ´µÄµØ·½±£Áô»ùÓÚ¶ÓÁеķ½°¸,²¢ÇÒÌí¼Ó¶îÍâµÄÏ̻߳òÕßÊØ»¤½ø³Ì,ËûÃÇÔÚд´½¨µÄÉ豸ÉϵȴýI/O²Ù×÷¡£µ±Êý¾Ý×¼±¸ºÃÒÔºó,ÕâЩÏ̻߳òÕßÊØ»¤½ø³Ì±»»½ÐÑ ,°´¶ÓÁнÓÊÜÊý¾Ý,ÓÉÓ¦ÓÃÏ̻߳òÕß½ø³ÌÈ¡¾¡Ê¹Óá£
ÒÆÖ²·½·¨°ÑRTOSÒÆÖ²µ½Ç¶ÈëʽLinux ÓëÉÌÒµÓ¦ÓóÌÐòÒÆÖ²Ã»ÓиÅÄîÉϵÄÇø±ð¡£µ±ÒÆÖ²µÄ»ù´¡ÐÔ¹¤×÷×¼±¸ºÃÁ˺󣨴´½¨make/build½Å±¾ºÍ¹¤¾ß£¬¼æÈÝÐÔ±àÒëÆ÷£¬Ìض¨µÄ°üº¬ÎļþµÈµÈ£©,´úÂë¼¶ÒÆÖ²°ÑÃæÁÙÓ¦Óüܹ¹ºÍÓ¦ÓóÌÐò£¨API£©Ê¹ÓÃÎÊÌâµÄÌôÕ½¡£
ΪÁ˱ãÓÚÏÂÃæµÄÌÖÂÛ£¬ÎÒÃǼÙÉè“Ó¦ÓÔ²¿·Ö£¨³ýÕë¶ÔI/OÒÔÍâµÄËùÓдúÂ룩»á±»´Ó»ùÓÚRTOSϵͳÖÐÒÆÖ²µ½µ¥¶ÀµÄÒ»¸öLinux½ø³Ì£»RTOSÈÎÎñÓ³Éäµ½LinuxỊ̈߳¬¶øÈÎÎñÀïµÄ½ø³Ì¼äͨÐÅ£¨IPC£©Ó³Éäµ½LinuxÀïÏ൱µÄ½ø³ÌÀïºÍÏß³ÌÀï¡£
Ó³ÉäRTOSÈÎÎñµ½Linux»ùÓÚ½ø³ÌµÄÏß³Ì Process-based Threads ÒÆÖ²µÄ»ù±¾¸ÅÄîÈÝÒ×Àí½â£¬Í¬Ê±ÎÊÌâ³öÏÖÔÚϸ½ÚÉÏ¡£×îÏÔ¶øÒ×¼ûµÄÊÇÕýÔÚÓ¦ÓÃÖеÄRTOSÓ¦ÓóÌÐò½Ó¿Ú£¬ÔõôÑù²ÅÄܱ£Áôµ½Linux½á¹¹ÖмÌÐøÊ¹Óá£
ÕûÌå·ÖÎö¨DÖØ¹¹
¼ÙÈçÄãµÄÏîĿûÓкܽôµÄʱ¼äÒªÇ󣬲¢ÇÒΪÁ˰ÑÀ´ÏîÄ¿¿É·´¸´Ê¹Óý¨Á¢¿ÉÒÆÖ²ÐÔ´úÂ룬Äã»á»¯Ê±¼ä·ÖÎöµ±Ç°RTOSÓ¦ÓóÌÐò½á¹¹£¬ºÍÈçºÎ°ÑËüÃÇÓ³Éäµ½Linux½á¹¹ÖÐÈ¥¡£¶ÔÓÚRTOSÓ¦ÓôúÂ룬ÄãÒª¿¼ÂǰÑRTOSÈÎÎñÒ»Ò»Ó³Éäµ½Linux»ùÓÚ½ø³ÌµÄÏ̵߳ÄÉú´æÄÜÁ¦£¬ºÍÊÇ·ñ°ÑRTOSÓ¦ÓÃÖØÐ·ÖÅäµ½¶à¸öLinux½ø³Ì¡£ÒÀÀµÓÚÑ¡Ôñ£¬Äã»áÖØÐ¿¼ÂÇʹÓÃÖеÄRTOS½ø³Ì¼äͨÐÅ£¨IPC£©£¬²ÉÓúÏÊʵĽø³Ì¼ä»òÕß½ø³ÌÄÚµÄͨÐÅ»úÖÆ¡£
¹²3Ò³: ÉÏÒ»Ò³ [1] 2 [3] ÏÂÒ»Ò³
|