±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ²©¿ÍÔ°£¬½«
OSAL ÕâÑùÒ»¸öʼþÇý¶¯µÄ¶àÈÎÎñµÄ×ÊÔ´·ÖÅä»úÖÆ×öÁËÒ»¸ö¼òÃ÷¶óÒªµÄ½éÉÜ£¬Ï£Íû¶Ô´ó¼ÒÓÐËù°ïÖú¡£ |
|
Ò»¡¢¸ÅÊö
OSAL (Operating System Abstraction Layer) £¬·ÒëΪ¡°²Ù×÷ϵͳ³éÏó²ã¡±¡£
OSAL ¾ÍÊÇÒ»ÖÖÖ§³Ö¶àÈÎÎñÔËÐеÄϵͳ×ÊÔ´·ÖÅä»úÖÆ¡£OSALÓë±ê×¼µÄ²Ù×÷ϵͳ»¹ÊÇÓкܴóµÄÇø±ðµÄ¡£¼òµ¥¶øÑÔ£¬
OSAL ʵÏÖÁËÀàËÆ²Ù×÷ϵͳµÄijЩ¹¦ÄÜ£¬µ«²¢²»ÄܳÆÖ®ÎªÕæÕýÒâÒåÉϵIJÙ×÷ϵͳ¡£
¶þ¡¢OSALÈÎÎñÔËÐз½Ê½
ÎÒÃÇÒÔTI1.2.1µÄ BLE ÐÒéÕ»ÖÐµÄ SimpleBLEPeripheral ΪÀý£¬·ÖÎöÒ»ÏÂ
OSAL ¡£ÆäÖÐÓÐÒ»¸ö simpleBLEPeripheral.c Îļþ£¬ÀïÃæÓÐ2¸ö±È½ÏÖØÒªµÄº¯Êý£ºSimpleBLEPeripheral_Init
ºÍ SimpleBLEPeripheral_ProcessEvent ¡£ SimpleBLEPeripheral_Init ÊÇÈÎÎñµÄ³õʼ»¯º¯Êý£¬¶ø SimpleBLEPeripheral_ProcessEvent Ôò¸ºÔð´¦Àí´«µÝ¸ø´ËÈÎÎñµÄʼþ¡£
´ó¸Åä¯ÀÀһϠSimpleBLEPeripheral_ProcessEvent Õâ¸öº¯Êý£¬ÎÒÃÇ¿ÉÒÔ·¢ÏÖ£¬´Ëº¯ÊýµÄÖ÷Òª¹¦ÄÜÊÇÅжÏÓɲÎÊý´«µÝµÄʼþÀàÐÍ£¬È»ºóÖ´ÐÐÏàÓ¦µÄʼþ´¦Àíº¯Êý¡£ÓÉ´Ë£¬¿ÉÒÔÍÆ¶Ï³ö
BLE ÐÒéÕ»Ó¦ÓóÌÐòµÄÔËÐлúÖÆÈçÏÂͼËùʾ£º

µ±ÓÐÒ»¸öʼþ·¢ÉúµÄʱºò£¬ OSAL ¸ºÔ𽫴Ëʼþ·ÖÅ䏸Äܹ»´¦Àí´ËʼþµÄÈÎÎñ£¬È»ºó´ËÈÎÎñÅжÏʼþµÄÀàÐÍ£¬µ÷ÓÃÏàÓ¦µÄʼþ´¦Àí³ÌÐò½øÐд¦Àí¡£
Ã÷°×ÁËÕâ¸öÎÊÌ⣬еÄÎÊÌâÓÖ°ÚÔÚÁËÎÒÃǵÄÃæÇ°£º OSAL ÊÇÈçºÎ´«µÝʼþ¸øÈÎÎñµÄ¡£
Èý¡¢OSALµÄʼþ´«µÝ»úÖÆ
ÔÚÊÔͼŪÇå³þÕâ¸öÎÊÌâ֮ǰ£¬ÎÒÃÇÐèҪŪÇå³þÁíÍâÒ»¸öÊ®·Ö»ù´¡¶øÖØÒªµÄÎÊÌâ¡£ÄǾÍÊÇÈçºÎÏòÎÒÃǵÄÓ¦ÓóÌÐòÖÐÌí¼ÓÒ»¸öÈÎÎñ¡£
ÎÒÃÇÏÈÀ´¿´¿´ simpleBLEPeripheral.c ÊÇÈçºÎÌí¼ÓÈÎÎñµÄ¡£
ÎÒÃÇ´ò¿ª OSAL_SimpleBLEPeripheral.c Îļþ¡£ÕâÀïÎÒÃÇ¿ÉÒÔÕÒµ½Ò»¸öºÜÖØÒªµÄÊý×étasksArr
ºÍÒ»¸öͬÑùºÜÖØÒªµÄº¯Êý osalInitTasks¡£
TaskArr Õâ¸öÊý×éÀï´æ·ÅÁËËùÓÐÈÎÎñµÄʼþ´¦Àíº¯ÊýµÄµØÖ·£¬ÔÚÕâÀïʼþ´¦Àíº¯Êý¾Í´ú±íÁËÈÎÎñ±¾Éí£¬Ò²¾ÍÊÇ˵ʼþ´¦Àíº¯Êý±êʶÁËÓëÆä¶ÔÓ¦µÄÈÎÎñ¡£
osalInitTasks ÊÇ OSAL µÄÈÎÎñ³õʼ»¯º¯Êý£¬ËùÓÐÈÎÎñµÄ³õʼ»¯¹¤×÷¶¼ÔÚÕâÀïÃæÍê³É£¬²¢ÇÒ×Ô¶¯¸øÃ¿¸öÈÎÎñ·ÖÅäÒ»¸öID¡£
ÒªÌí¼ÓÐÂÈÎÎñ£¬ÎÒÃÇÐèÒª±àдÐÂÈÎÎñµÄʼþ´¦Àíº¯ÊýºÍ³õʼ»¯º¯Êý£¬È»ºó½«Ê¼þ´¦Àíº¯ÊýµÄµØÖ·¼ÓÈë´ËÊý×顣ȻºóÔÚ
osalInitTasks Öе÷ÓôËÈÎÎñµÄ³õʼ»¯º¯Êý¡£ÔÚ´ËÀýÖУ¬ÎÒÃÇ´ËǰÌáµ½¹ýµÄSimpleBLEPeripheral_ProcessEvent
Õâ¸öº¯Êý±»Ìí¼Óµ½ÁËÊý×éµÄĩ⣬ SimpleBLEPeripheral_Init Õâ¸öº¯ÊýÔÚ osalInitTasks
Öб»µ÷Óá£
ÖµµÃ×¢ÒâµÄÊÇ£¬TaskArr Êý×éÀï¸÷ÈÎÎñº¯ÊýµÄÅÅÁÐ˳ÐòÒªÓë osalInitTasks º¯ÊýÖе÷Óø÷ÈÎÎñ³õʼ»¯º¯ÊýµÄ˳Ðò±ØÐëÒ»Ö£¬Ö»ÓÐÕâÑù²ÅÄܹ»±£Ö¤Ã¿¸öÈÎÎñÄܹ»Í¨¹ý³õʼ»¯º¯Êý½ÓÊÕµ½ÕýÈ·µÄÈÎÎñID¡£
ÁíÍ⣬ΪÁ˱£´æÈÎÎñ³õʼ»¯º¯ÊýËù½ÓÊÕµÄÈÎÎñID£¬ÎÒÃÇÐèÒª¸øÃ¿Ò»¸öÈÎÎñ¶¨ÒåÒ»¸öÈ«¾Ö±äÁ¿À´±£´æÕâ¸öID¡£ÔÚ
SimpleBLEPeripheral ÖÐ SimpleBLEPeripheral.c Öж¨ÒåÁËÒ»¸öÈ«¾Ö±äÁ¿
SimpleBLEPeripheral_TaskID ;²¢ÇÒÔÚ SimpleBLEPeripheral_Init
º¯ÊýÖнøÐÐÁ˸³Öµ
{
SimpleBLEPeripheral_TaskID = task_id;
} |
ÕâÌõÓï¾ä½«·ÖÅ䏸SimpleBLEPeripheral µÄÈÎÎñID±£´æÁËÏÂÀ´¡£
µ½´Ë£¬ÎÒÃǾ͸øÓ¦ÓóÌÐòÖÐÍêÕûµÄÌí¼ÓÁËÒ»¸öÈÎÎñ¡£
ÎÒÃǻص½ OSAL ÈçºÎ½«Ê¼þ·ÖÅ䏸ÈÎÎñÕâ¸öÎÊÌâÉÏÀ´£¬ ÔÚ OSAL_SimpleBLEPeripheral.cÕâ¸öÎļþÖУ¬ÔÚ¶¨Òå
TaskArr Õâ¸öÊý×éÖ®ºó£¬ÓÖ¶¨ÒåÁËÁ½¸öÈ«¾Ö±äÁ¿¡£
tasksCntÕâ¸ö±äÁ¿±£´æÁ˵±Ç°µÄÈÎÎñ¸öÊý¡£
tasksEvents ÊÇÒ»¸öÖ¸ÏòÊý×éµÄÖ¸Õ룬´ËÊý×é±£´æÁ˵±Ç°ÈÎÎñµÄ״̬¡£ÔÚÈÎÎñ³õʼ»¯º¯ÊýÖÐ×öÁËÈçϲÙ×÷
{
tasksEvents = (uint16 *)osal_mem_alloc( sizeof(
uint16 ) * tasksCnt );
osal_memset( tasksEvents, 0, (sizeof( uint16 )
* tasksCnt));
}
/ *osal_mem_alloc()Ϊµ±Ç°OSALÖеĸ÷ÈÎÎñ·ÖÅä´æ´¢¿Õ¼ä(ʵ¼ÊÉÏÊÇÒ»¸öÈÎÎñÊý×é),
º¯Êý·µ»ØÖ¸ÏòÈÎÎñ»º³åÇøµÄÖ¸Õ룬Òò´ËtasksEventsÖ¸Ïò¸ÃÈÎÎñÊý×é(ÈÎÎñ¶ÓÁÐ).×¢Òâ
tasksEventsºÍºóÃæÌ¸µ½µÄtasksArr[]ÀïµÄ˳ÐòÊÇÒ»Ò»¶ÔÓ¦µÄ, tasksArr[
]ÖеĵÚi¸ö
ʼþ´¦Àíº¯Êý¶ÔÓ¦ÓÚtasksEventsÖеĵÚi¸öÈÎÎñµÄʼþ.* /
/*osal _ memset£¨£©°Ñ¿ª±ÙµÄÄÚ´æÈ«²¿ÉèÖÃΪ0£»sizeof( uint16 )ÊÇ2¸ö×Ö½Ú£¬¼´Ò»¸öÈÎÎñµÄ³¤¶È£¨ÈÎÎñº¯ÊýͬÑùÊÇuint16¶¨Ò壩£¬³ËÒÔÈÎÎñÊýÁ¿tasksCnt£¬¼´È«²¿ÄÚ´æ¿Õ¼ä*/ |
ÎÒÃÇ¿ÉÒÔ¿´³öËùÓÐÈÎÎñµÄ״̬¶¼±»³õʼ»¯Îª0¡£´ú±íÁ˵±Ç°ÈÎÎñûÓÐÐèÒªÏìÓ¦µÄʼþ¡£
½ô½Ó×Å£¬ÎÒÃÇÀ´µ½ÁË main() º¯Êý¡£´Ë SimpleBLEPeripheral_Main.c
ÎļþÖС£ÂÔ¹ýÐí¶à¶Ôµ±Ç°À´Ëµ²¢·ÇÖØÒªµÄÓï¾ä£¬ÎÒÃÇÏÈÀ´¿´ osal_init_system() Õâ¸öº¯Êý¡£Ôڴ˺¯ÊýÖУ¬osalInitTasks()
±»µ÷Ó㬴ӶøtasksEvents ÖеÄËùÓÐÄÚÈݱ»³õʼ»¯Îª0¡£
Ö®ºó£¬ÔÚmain() º¯ÊýÖУ¬ÎÒÃǽøÈëÁËosal_start_system() º¯Êý£¬´Ëº¯ÊýΪһ¸öËÀÑ»·£¬ÔÚÕâ¸öÑ»·ÖУ¬Íê³ÉÁËËùÓеÄʼþ·ÖÅä¡£
Ê×ÏÈÎÒÃÇÀ´¿´ÕâÑùÒ»¶Î´úÂ룺
{
do
{
if (tasksEvents[idx])
{
break;
}
} while (++idx < tasksCnt);
} |
µ±tasksEvents Õâ¸öÊý×éÖеÄij¸öÔªËØ²»Îª0£¬¼´´ú±í´ËÈÎÎñÓÐʼþÐèÒªÏàÓ¦£¬Ê¼þÀàÐÍÈ¡¾öÓÚÕâ¸öÔªËØµÄÖµ¡£Õâ¸ödo-while
Ñ»·»áÑ¡³öµ±Ç°ÓÅÏȼ¶×î¸ßµÄÐèÒªÏìÓ¦µÄÈÎÎñ£¬
{
events = (tasksArr[idx])( idx, events );
} |
´ËÓï¾äµ÷Óà tasksArrÊý×éÀïÃæÏàÓ¦µÄʼþ´¦Àíº¯ÊýÀ´ÏìӦʼþ¡£Èç¹ûÎÒÃÇÐÂÌí¼ÓµÄÈÎÎñÓÐÁËÐèÒªÏìÓ¦µÄʼþ£¬ÄÇô´ËÈÎÎñµÄʼþ´¦Àí³ÌÐò½«»á±»µ÷Óá£
¾ÍÕâÑù£¬OSAL ¾Í½«ÐèÒªÏìÓ¦µÄʼþ´«µÝ¸øÁ˶ÔÓ¦µÄÈÎÎñ´¦Àíº¯Êý½øÐд¦Àí¡£
¸½£ºÏê½â events = (tasksArr[idx])( idx, events )£»
(tasksArr[idx])( idx, events )ÊÇÒ»¸öº¯ÊýÖ¸ÕëÊý×é¡£ÄÇôʲôÊǺ¯ÊýÖ¸ÕëÊý×éÄØ£¿¹ËÃû˼Ò壬º¯ÊýÖ¸ÕëÊý×éÊÇÒ»¸öÊý×飬Êý×éÖдæ·ÅµÄÔªËØÀàÐÍÊǺ¯ÊýµÄÖ¸Õë¡£±í´ïʽ¾ÙÀý£ºchar£¨*p[]£©(int
i) ;¶ÔÓÚÕâ¸ö±í´ïʽÎÒÃÇ´ÓÓï·¨ÉϽâÊÍΪ£¬pÊÇÒ»¸öÊý×é±äÁ¿Ãû£¬Êý×é±äÁ¿ÀàÐÍÊÇchar£¨*£©£¨int
i£©£¬´æ·ÅÔªËØµÄÀàÐÍÊÇ£ºchar£¨int i£©º¯ÊýµÄÖ¸Õë¡£
tasksArr[idx]¾ÍÊÇÒ»¸öº¯ÊýÖ¸ÕëÊý×飬ÀïÃæ´æ´¢µÄ¾ÍÊǺ¯ÊýµÄÖ¸Õë¡£
const pTaskEventHandlerFn tasksArr[]
=
{
LL_ProcessEvent, // task 0
Hal_ProcessEvent, // task 1
HCI_ProcessEvent, // task 2
#if defined ( OSAL_CBTIMER_NUM_TASKS )
OSAL_CBTIMER_PROCESS_EVENT( osal_CbTimerProcessEvent
), // task 3
#endif
L2CAP_ProcessEvent, // task 4
GAP_ProcessEvent, // task 5
GATT_ProcessEvent, // task 6
SM_ProcessEvent, // task 7
GAPRole_ProcessEvent, // task 8
GAPBondMgr_ProcessEvent, // task 9
GATTServApp_ProcessEvent, // task 10
SimpleBLEPeripheral_ProcessEvent // task 11
}; |
¼ÙÉèidx=11;£»ÄÇôevents = (tasksArr[11])( 11, events );£»Ò²¾ÍÊǵ÷ÓÃÁËSimpleBLEPeripheral_ProcessEventÕâ¸öº¯Êý£¬ÆäÖд«ÈëµÄ²ÎÊý¾ÍÊÇ£¨11£¬events£©£»Ò²¾ÍÊǵ÷ÓÃÁËevents
= (tasksArr[11])( 11, events )£»Æäʵ¾ÍÊÇÖ´ÐÐÁËSimpleBLEPeripheral_ProcessEvent(11,events);
ËÄ¡¢Ê¼þµÄ²¶»ñ
²»¹ý½ÓÏÂÀ´¾ÍÓÐÁ˸ü¼ÓÉîÈëµÄÎÊÌâÁË£¬Ê¼þÊÇÈçºÎ±»²¶»ñµÄ£¿Ö±¹ÛһЩÀ´Ëµ¾ÍÊÇ£¬tasksEventsÕâ¸öÊý×éÀïµÄÔªËØÊÇʲôʱºò±»É趨Ϊ·ÇÁãÊý£¬À´±íʾÓÐʼþÐèÒª´¦ÀíµÄ£¿ÎªÁËÏêϸµÄ˵Ã÷Õâ¸ö¹ý³Ì£¬ÎÒ½«ÒÔSimpleBLEPeripheralÕâ¸öÀý³ÌÖÐÏìÓ¦°´¼üµÄ¹ý³ÌÀ´½øÐÐ˵Ã÷¡£ÆäËûµÄʼþËäÈ»ÉÔÓвî±ð£¬È´ÊÇ´óͬСÒì¡£
°´¼üÔÚÎÒÃǵÄÓ¦ÓÃÀïÃæÓ¦¸ÃÊôÓÚÓ²¼þ×ÊÔ´£¬ËùÒÔOSALÀíӦΪÎÒÃÇÌṩʹÓú͹ÜÀíÕâЩӲ¼þµÄ·þÎñ¡£ÉÔ΢ÁôÒâÒ»ÏÂÎÒÃÇ֮ǰ˵¹ýµÄtasksArrÕâÑùÒ»¸öÊý×飬Ëü±£´æÁËËùÓÐÈÎÎñµÄʼþ´¦Àíº¯Êý¡£ÎÒÃÇ´ÓÖз¢ÏÖÁËÒ»¸öºÜÖØÒªµÄÐÅÏ¢£ºHal_ProcessEvent¡£HAL£¨Hardware
Abstraction Layer£©·ÒëΪ¡°Ó²¼þ³éÏó²ã¡±¡£Ðí¶àÈËÔÚÕâÀï¾³£°Ñ½« BLE µÄÓ²¼þ³éÏó²ãÓëÎïÀí²ã»ìΪһ̸¡£ÔÚÕâÀÎÒÃÇÓ¦¸Ã½«
BLE µÄÓ²¼þ³éÏó²ãÓëÎïÀí²ãÇø·Ö¿ªÀ´¡£Ó²¼þ³éÏó²ãËù°üº¬µÄ·¶Î§ÊÇÎÒÃǵ±Ç°Ó²¼þµç·ÉÏÃæËùÓжÔÓÚϵͳ¿ÉÓõÄÉ豸×ÊÔ´¡£¶øÎïÀí²ãÔòÊÇÕë¶ÔÎÞÏßͨÐŶøÑÔ£¬ËüËù°üº¬µÄ½öÏÞÓÚÖ§³ÖÎÞÏßͨѶµÄÓ²¼þÉ豸¡£
ͨ¹ýÕâ¸öÖØÒªµÄÐÅÏ¢£¬ÎÒÃÇ¿ÉÒԵóöÕâÑùÒ»¸ö½áÂÛ£º OSAL ½«Ó²¼þµÄ¹ÜÀíÒ²×÷Ϊһ¸öÈÎÎñÀ´´¦Àí¡£ÄÇôÎÒÃǺÜ×ÔÈ»µÄȥѰÕÒ
Hal_ProcessEvent Õâ¸öʼþ´¦Àíº¯Êý£¬¿´¿´Ëü¾¿¾¹ÊÇÈçºÎ¹ÜÀíÓ²¼þ×ÊÔ´µÄ¡£
ÔÚ ¡°HAL\Commn\ hal_drivers.c¡± Õâ¸öÎļþÖУ¬ÎÒÃÇÕÒµ½ÁËÕâ¸öº¯Êý¡£ÎÒÃÇÖ±½Ó·ÖÎöÓë°´¼üÓйصÄÒ»²¿·Ö¡£
{
if (events & HAL_KEY_EVENT)
{
#if (defined HAL_KEY) && (HAL_KEY == TRUE)
/* Check for keys */
HalKeyPoll();
/* if interrupt disabled, do next polling */
if (!Hal_KeyIntEnable)
{
osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT,
100);
}
#endif // HAL_KEY
return events ^ HAL_KEY_EVENT;
}
} |
ÔÚʼþ´¦Àíº¯Êý½ÓÊÕµ½ HAL_KEY_EVENT ÕâÑùÒ»¸öʼþºó£¬Ê×ÏÈÖ´ÐÐHalKeyPoll()º¯Êý¡£ÓÉÓÚÕâ¸öÀý³ÌµÄ°´¼ü²ÉÓòéѯµÄ·½·¨»ñÈ¡£¬ËùÒÔÊǽûÖ¹Öжϵģ¬ÓÚÊDZí´ïʽ£¨!Hal_KeyIntEnable£©µÄÖµÎªÕæ¡£ÄÇôosal_start_timerEx(
Hal_TaskID, HAL_KEY_EVENT, 100)µÃÒÔÖ´ÐС£osal_start_timerEx
ÕâÊÇÒ»¸öºÜ³£Óõĺ¯Êý£¬ËüÔÚÕâÀïµÄ¹¦ÄÜÊǾ¹ý100ºÁÃëºó£¬Ïò Hal_TaskID Õâ¸öIDËù±êʾµÄÈÎÎñ£¨Ò²¾ÍÊÇÆä±¾Éí£©·¢ËÍÒ»¸ö
HAL_KEY_EVENT ʼþ¡£ÕâÑùÒÔÀ´£¬Ã¿¾¹ý100ºÁÃ룬 Hal_ProcessEventÕâ¸öʼþ´¦Àíº¯Êý¶¼»áÖÁÉÙÖ´ÐÐÒ»´ÎÀ´´¦Àí
HAL_KEY_EVENT ʼþ¡£Ò²¾ÍÊÇ˵ÿ¸ô100ºÁÃë¶¼»áÖ´ÐÐ HalKeyPoll() º¯Êý¡£
ÄÇôÎÒÃÇÀ´¿´¿´HalKeyPollº¯Êýµ½µ×ÔÚ¸ãʲô¹í£¡
´úÂëÖиøµÄ×¢ÊÍΪ£º
/* Check for keys */
HalKeyPoll(); |
ÓÚÊÇÎÒÃÇÍÆ¶ÏÕâ¸öº¯ÊýµÄ×÷ÓÃÊǼì²éµ±Ç°µÄ°´¼üÇé¿ö¡£½øÈ뺯ÊýÒ»¿´£¬¹û²»ÆäÈ»¡£ËäÈ»Õâ¸öº¯ÊýºÜ³¤ºÜ¸´ÔÓ£¬²»¹ýƾ½è×Å·Ç·²µÄ´ÏÃ÷²ÅÖÇ£¬ÎÒÃÇ»¹ÊÇÊ®·ÖÇå³þµÄÃ÷°×ÁË£¬¾¹ýһϵÁеÄifÓï¾äºÍ¸³ÖµÓï¾ä£¬ÔÚ½Ó½üº¯ÊýĩβµÄµØ·½£¬
keys±äÁ¿£¨ÔÚº¯ÊýÆðʼλÖö¨ÒåµÄ£©»ñµÃÁ˵±Ç°°´¼üµÄ״̬¡£×îºó£¬ÓÐÒ»¸öÊ®·ÖÖØÒªµÄº¯Êýµ÷Óá£
( pHalKeyProcessFunction)
( keys, HAL_KEY_STATE_NORMAL ) ; |
pHalKeyProcessFunctionÕâ¸öº¯ÊýÖ¸ÕëÖ¸ÏòÁËÄĸöº¯ÊýÎÒÃÇÏÖÔÚÒÀÈ»²»Çå³þ£¬µ«ÊÇΪÁËÎÒÃÇÓиöÇåÎú¶ø²»¼ä¶ÏµÄ˼·£¬ÎÒÔÚÕâÀïÏȸæËß´ó¼Ò¡£ÔÚÕâÀïµ÷ÓõÄÊÇ
void OnBoard_KeyCallback ( uint8
keys, uint8 state ) |
Õâ¸öº¯Êý¡£´Ëº¯ÊýÔÚ¡°OnBoard .c¡±ÎļþÖпÉÒÔÕÒµ½¡£ÔÚÕâ¸öº¯ÊýÖУ¬ÓÖµ÷ÓÃÁË
void OnBoard_KeyCallback ( uint8
keys, uint8 state ) |
ÔÚÕâ¸öº¯ÊýÖУ¬°´¼üµÄ״̬ÐÅÏ¢±»·â×°µ½ÁËÒ»¸öÏûÏ¢½á¹¹ÌåÖУ¨¶ÔÓÚÏûÏ¢£¬ÎÒÃÇÉÔºóÔÙ˵£©¡£×îºóÓÐÒ»¸ö¼«ÆäÖØÒªµÄº¯Êý±»µ÷ÓÃÁË¡£
osal _ msg_send(
registeredKeysTaskID, ( uint8 * ) msgPtr ); |
ÓëÇ°ÃæµÄpHalKeyProcessFunctionÏàͬ£¬ÎÒÏÈÖ±½Ó¸æËß´ó¼ÒregisteredKeysTaskIDËùָʾµÄÈÎÎñÕýÊÇÎÒÃÇÐèÒªÏìÓ¦°´¼üµÄSimpleBLEPeripheralÕâ¸öÈÎÎñ¡£
ÄÇôҲ¾ÍÊÇ˵£¬ÔÚÕâÀïÎÒÃÇÏòSimpleBLEPeripheral·¢ËÍÁËÒ»¸ö¸½´ø°´¼üÐÅÏ¢µÄÏûÏ¢¡£ÔÚosal_msg_sendº¯ÊýÖÐ
osal_set_event( destination_task,
SYS_EVENT_MSG ); |
±»µ÷Óã¬ËüÔÚÕâÀïµÄ×÷ÓÃÊÇÉèÖÃdestination_taskÕâ¸öÈÎÎñµÄʼþΪSYS_EVENT_MSG¡£¶øÕâ¸ödestination_taskÕýʽÓÉosal_msg_sendÕâ¸öº¯Êýͨ¹ý²ÎÊý´«µÝ¶øÀ´µÄ£¬ËüҲָʾµÄÊÇSimpleBLEPeripheralÕâ¸öÈÎÎñ¡£ÔÚosal_set_eventÕâ¸öº¯ÊýÖУ¬ÓÐÕâÑùÒ»¸öÓï¾ä£º
{
tasksEvents[task_id] |= event_flag;
} |
ÖÁ´Ë£¬¸Õ²ÅËùÌáµ½µÄÎÊÌâµÃµ½Á˽â¾ö¡£ÎÒÃÇÔÙ½«Õâ¸ö¹ý³ÌÕûÀíÒ»±é¡£
Ê×ÏÈ£¬OSALרÃŽ¨Á¢ÁËÒ»¸öÈÎÎñÀ´¶ÔÓ²¼þ×ÊÔ´½øÐйÜÀí£¬Õâ¸öÈÎÎñµÄʼþ´¦Àíº¯ÊýÊÇHal_ProcessEvent
¡£ÔÚÕâ¸öº¯ÊýÖÐͨ¹ýµ÷ÓÃosal _ start_timerEx( Hal _ TaskID, HAL_KEY_EVENT,
100);Õâ¸öº¯ÊýʹµÃÿ¸ô100ºÁÃë¾Í»áÖ´ÐÐÒ»´Î HalKeyPoll( )º¯Êý¡£HalKeyPoll(
)»ñÈ¡µ±Ç°°´¼üµÄ״̬£¬²¢ÇÒͨ¹ýµ÷ÓÃOnBoard _ KeyCallback º¯ÊýÏòSimpleBLEPeripheral
ÈÎÎñ·¢ËÍÒ»¸ö°´¼üÏûÏ¢£¬²¢ÇÒÉèÖÃtasksEvents ÖÐSimpleBLEPeripheral Ëù¶ÔÓ¦µÄֵΪ·ÇÁã¡£Èç´Ë£¬µ±mainº¯ÊýÀïÕâÑùÒ»¶Î´úÂë
{
do
{
if (tasksEvents[idx])
{
break;
}
} while (++idx < tasksCnt);
} |
Ö´ÐÐÁËÒÔºó£¬SimpleBLEPeripheral Õâ¸öÈÎÎñ¾Í»á±»ÌôÑ¡³öÀ´¡£È»ºóͨ¹ý
events = (tasksArr[idx])( idx, events
)£» |
Õâ¸öº¯Êýµ÷ÓÃÆäʼþ´¦Àíº¯Êý£¬Íê³ÉʼþµÄÏìÓ¦¡£
ÏÖÔÚ£¬ÎÒÃǻعýÍ·À´´¦ÀíÎÒÃÇ֮ǰÒÅÁôÏÂÀ´µÄÎÊÌâ¡£
µÚÒ»¡¢pHalKeyProcessFunction Õâ¸öº¯ÊýÖ¸ÕëΪºÎÖ¸ÏòÁËOnBoard_KeyCallbackº¯Êý¡£
ÔÚHAL\Common\ hal_drivers.cÕâ¸öÎļþÖУ¬ÎÒÃÇÕÒµ½ÁËHalDriverInit
Õâ¸öº¯Êý£¬ÔÚÕâ¸öº¯ÊýÖУ¬°´¼üµÄ³õʼ»¯º¯ÊýHalKeyInit ±»µ÷Óá£ÔÚHalKeyInit ÖÐÓÐÕâÑùµÄÓï¾ä£º
{
pHalKeyProcessFunction = NULL;
} |
Õâ˵Ã÷ÔÚ³õʼ»¯ÒÔºópHalKeyProcessFunction ²¢Ã»ÓÐÖ¸ÏòÈκÎÒ»¸öº¯Êý¡£ÄÇpHalKeyProcessFunction
ÊÇʲôʱºò±»¸³ÖµµÄÄØ£¿
¾ÍÔÚHalKeyInitµÄÏ·½ÓÐÒ»¸öÕâÑùµÄº¯ÊýHalKeyConfig ¡£ÆäÖÐÓÐÕâÑùÒ»ÌõÓï¾ä£º
pHalKeyProcessFunction = cback£» |
cback ÊÇHalKeyConfig Ëù´«½øÀ´µÄ²ÎÊý£¬ËùÒÔ£¬ÏëÒªÖªµÀËüËùÖ¸ÏòµÄº¯Êý£¬±ØÐëÕÒµ½Æäµ÷Óõĵط½¡£¾¹ý¼òµ¥µÄËÑË÷ÎÒÃDz»ÄÑÕÒ³ö´ð°¸¡£ÔÚmainº¯ÊýÖÐÓÐÕâÑùÒ»¸öº¯Êýµ÷ÓãºInitBoard(
OB_READY ); ´Ëº¯ÊýÖÐ×öÁËÈçϵ÷Óãº
{
HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback);
} |
µÚ¶þ¡¢registeredKeysTaskID Ϊʲô±êʶÁËSimpleBLEPeripheral
Õâ¸öÈÎÎñ£¿
ÓÉÓÚ OSAL ÊÇÒ»¸öÖ§³Ö¶àÈÎÎñµÄµ÷¶È»úÖÆ£¬ËùÒÔÔÚͬһʱ¼äÄÚ½«»áÓжà¸öÈÎÎñͬʱÔËÐС£µ«ÊÇ´ÓÂß¼ÉÏÀ´½²£¬Ò»¸öʼþÖ»ÄÜÓÉÒ»¸öÈÎÎñÀ´´¦Àí¡£°´¼üʼþÒ²²»ÀýÍâ¡£
ÄÇôÈçºÎÏò OSAL ÉùÃ÷´¦Àí°´¼üʼþµÄÈÎÎñÊÇSimpleBLEPeripheral ÄØ£¿
ÔÚSimpleBLEPeripheral_Init £¨SimpleBLEPeripheral µÄÈÎÎñ³õʼ»¯º¯Êý£©ÖÐÓÐÕâôһ¸öÓï¾ä£º
{
RegisterForKeys( SimpleBLEPeripheral_TaskID );
} |
RegisterForKeys º¯ÊýÏò OSAL ÉùÃ÷°´¼üʼþ½«ÓÉ SimpleBLEPeripheral
ÈÎÎñÀ´´¦Àí¡£ÔÚ RegisterForKeys º¯ÊýÖУº
{
registeredKeysTaskID = task_id;
} |
ÎÒÏëÎÒ²»ÓÃÔÙ×ö¶àÓàµÄ½âÊÍÁË£¬´ÏÃ÷µÄÄú¿Ï¶¨¿ÉÒÔÀí½â¡£
Îå¡¢ÏûÏ¢¶ÓÁÐ
Ê×ÏÈÎÒÐèÒªÏò´ó¼Ò½âÊÍÇå³þÏûÏ¢ÓëʼþµÄÁªÏµ¡£Ê¼þÊÇÇý¶¯ÈÎÎñÈ¥Ö´ÐÐijЩ²Ù×÷µÄÌõ¼þ£¬µ±ÏµÍ³²úÉúÁËÒ»¸öʼþ£¬½«Õâ¸ö´«µÝ¸øÏàÓ¦µÄÈÎÎñºó£¬ÈÎÎñ²ÅÄÜÖ´ÐÐÒ»¸öÏàÓ¦µÄ²Ù×÷¡£µ«ÊÇijЩʼþÔÚËü·¢ÉúµÄͬʱ£¬ÓÖ°éËæ×ÅһЩ¸½¼ÓÐÅÏ¢µÄ²úÉú¡£ÈÎÎñµÄʼþ´¦Àíº¯ÊýÔÚ´¦ÀíÕâ¸öʼþµÄʱºò£¬»¹ÐèÒª²Î¿¼Æä¸½¼ÓÐÅÏ¢¡£×îµäÐ͵ÄÒ»Àà±ãÊǰ´¼üÏûÏ¢£¬Ëüͬʱ²úÉúÁËÒ»¸öÄĸö°´¼ü±»°´ÏÂÁ˸½¼ÓÐÅÏ¢¡£ËùÒÔÔÚOnBoard_SendKeys
Õâ¸öº¯ÊýÖУ¬²»½öÏòSimpleBLEPeripheral ·¢ËÍÁËʼþ£¬»¹Í¨¹ýµ÷ÓÃosal_msg_send
º¯ÊýÏòSimpleBLEPeripheral ·¢ËÍÁËÒ»¸öÏûÏ¢£¬Õâ¸öÏûÏ¢¼Ç¼ÁËÕâ¸öʼþµÄ¸½¼ÓÐÅÏ¢¡£ÔÚSimpleBLEPeripheral_ProcessEvent
ÖУ¬Í¨¹ý
{
MSGpkt = ( afIncomingMSGPacket_t *)osal_msg_receive(
SimpleBLEPeripheral _ TaskID );
} |
»ñÈ¡ÁËÕâÑùÒ»¸öÏûÏ¢£¬È»ºóÔÙ½øÒ»²½´¦Àí¡£
OSAL ÔÚºǫ́ά»¤ÁËÒ»¸öÏûÏ¢¶ÓÁУ¬Ã¿Ò»¸öÏûÏ¢¶¼»á±»·Åµ½Õâ¸öÏûÏ¢¶ÓÁÐÖÐÈ¥£¬µ±ÈÎÎñ½ÓÊÕµ½Ê¼þÒԺ󣬴ÓÏûÏ¢¶ÓÁÐÖлñÈ¡ÊôÓÚ×Ô¼ºµÄÏûÏ¢£¬È»ºó½øÐд¦Àí¡£
|