ÄÚÈÝ·¢²¼¸üÐÂʱ¼ä : 2026/3/14 15:57:18ÐÇÆÚÒ» ÏÂÃæÊÇÎÄÕµÄÈ«²¿ÄÚÈÝÇëÈÏÕæÔĶÁ¡£
4.3 ͨÓÃÓ¦Óüܹ¹
ÕâÒ»Õ½«ÃèÊöÒ»¸öÓ¦ÓÃÈÎÎñµÄ´´½¨µÄ¸ü¶àµÄϸ½Ú 4.3.1 Ó¦Óóõʼ»¯º¯Êý
µÚ3.3ÕÂÃèÊöÁËÒ»¸öÈÎÎñÊÇÈçºÎ¹¹½¨µÄ¡£ÔÚÈÎÎñ±»¹¹½¨Ö®ºó£¬SYS/BIOSÄں˵÷¶È½ø³Ì¾Í¿ªÊ¼£¬ÔÚÈÎÎñ¹¹½¨¹ý³Ìͨ¹ýµÄº¯Êý»áÔÚÈÎÎñ¾ÍÐ÷ʱÔËÐУ¨±ÈÈçSimpleBLEperipheral_taskFxn£©¡£¸Ãº¯ÊýµÚÒ»¼þÓ¦¸Ã×öµÄʾÍÊǵͰ¡ÓÃÒ»¸öÓ¦Óóõʼ»¯º¯Êý¡£¾ÙÀý˵Ã÷£¬ÔÚSimpleBLEPerpheral.cÖУº
static void SimpleBLEPeripheral_taskFxn(UArg a0, UArg a1) {
// Initialize application
SimpleBLEPeripheral_init(); // Application main loop for (;;) { ¡
Õâ¸ö³õʼ»¯º¯Êý£¬SimpleBLEPeripheral_init()£¬ÅäÖÃÁËÊý¸ö·þÎñ¸øÈÎÎñͬʱҲÉèÖÃϵÁÐÓ²¼þºÍÈí¼þµÄÅäÖÃÉèÖúͲÎÊý¡£Ò»Ð©¹²Í¬µÄÀý×Ó¾ÍÊÇ£º³õʼ»¯GATT¿Í»§¶Ë£¬×¢²á¸÷ÖÖProfileÖеĻص÷º¯Êý£¬ÉèÖÃGAPRole£¬ÉèÖð󶨹ÜÀí£¬ÉèÖÃGAP²ã£¬ÅäÖÃÓ²¼þÄ£¿éÈçLCD£¬SPIµÈ¡£ÔÚ¸ÃÖ¸µ¼Öв鿴Ïà¹ØÕ½ڻñÈ¡ÕâЩÀý×ӵĸü¶àÐÅÏ¢¡£
×¢Ò⣺ÔÚÓ¦Óóõʼ»¯º¯ÊýÖУ¬ICall_registerApp()±ØÐëÔÚÆäËûÕ»½Ó¿Úµ÷ÓÃ֮ǰµ÷Óᣠ4.3.2 ÈÎÎñº¯ÊýÖеÄʼþ½ø³Ì¡£
ÔÚ³õʼ»¯º¯ÊýÖ®ºó£¬ÏñÉÏÃæ´úÂëÖÐչʾµÄÒ»Ñù£¬ÈÎÎñº¯Êý»á½øÈëÒ»¸öÎÞÏÞÑ»·ÖУ¬Ëü½«»á±£³Ö×èÈû²¢µÈ´ýÒ»¸öÐÅºÅÆì·¢ËÍÒ»¸öеÄÔÒò¸ø½ø³Ì£º
ICall_Errno errno = ICall_wait(ICALL_TIMEOUT_FOREVER); if (errno == ICALL_ERRNO_SUCCESS) { ...
Ò»µ©Ò»¸öʼþ»òÆäËûµÄ´Ì¼¤·¢Éú²¢´¦Àí£¬ÈÎÎñ¾Í»áÔٴνøÈë¶¥´÷ÐÅºÅÆì²¢±£³Ö×èÈû״̬֪µÀÆäËûµÄÔÒòÈ¥Ö´ÐС£Çë¿´ÏÂÃæµÄÂ߼ͼ£º
ÈçÉÏͼËùʾ£¬ÕâÀïÓжàÖÖÀíÓÉ¿ÉÒÔµ¼ÖÂÐÅºÅÆìͨ¹ý²¢ÇÒʹÈÎÎñ¼¤»îÖ´ÐУ¬ËûÃǰüÀ¨£º 4.3.2.1 ÄÚ²¿ÈÎÎñÏûÏ¢
5 6 7 8 9
if (ICall_fetchServiceMsg(&src, &dest, (void **)&pMsg) == ICALL_ERRNO_SUCCESS) {
if ((src == ICALL_SERVICE_CLASS_BLE) && (dest == selfEntity)) {
10 // Process inter-task message
11 SimpleBLEPeripheral_processStackMsg((ICall_Hdr *)pMsg); 12 } 13 if (pMsg) 14 {
15 ICall_freeMsg(pMsg);
16 }
ÕâЩÊÇÆäËûÈÎÎñ£¨ÈçBLEÐÒéÕ»£©Í¨¹ýICall·¢Ë͸øÓ¦ÓõÄÏûÏ¢¡£ÔÚSimpleBLEPeripheral¹¤³ÌÖÐûÓÐÕâÑùµÄÀý×Ó¡£ÆäËû¿ÉÄܵÄÀý×ÓÓУº 1. Ò»¸öÈ·¶¨µÄ·¢ËÍ×ÔÐÒéջȷÈϵĿÕÖÐָʾ
2. Ò»¸ö·¢ËÍ×ÔÐÒéÕ»µÄ¡¢Á¬½ÓʼþºÍ¹ã²¥½áÊøµÄ֪ͨ¡£
3. Ò»¸ö»Ø¸´¸øGATT¿Í»§¶ËµÄ²Ù×÷¡£¿´5.3.3ÕÂÓÐÕâ·½ÃæµÄÀý×Ó¡£ 4.3.2.1.1 ÄÚ²¿ÈÎÎñʼþ
ÔÚһЩÉÙÊýµÄ°¸ÀýÖУ¬BLEÐÒéÕ»½«»áͨ¹ýICallÔÚÓ¦ÓÃÈÎÎñÖÐÉèÖÃÒ»¸öʼþ¡£ÕâÑùµÄÀý×Ó¾Í
Êǵ±HCI_EXT_AdvEventNoticeCmd()µ÷ÓÃʱ¡£ÔÚÕâЩ°¸ÀýÖУ¬ÐÂÔöµÄ´úÂëÐèÌí¼Óµ½ifÓï¾äÖÐÄ¿µÄÊÇΪÁËÓëBLEÐÒéջʼþºÍÏûÏ¢×÷³öÇø±ð¡£ÕâÒ»µã½«»áÔÚ±¾ÎĵµµÄÈκÎÐèÒªµÄµØ·½¶¼»áÃ÷È·µÄÌáʾ¡£ÕâÑùÌí¼Ó¼ì²éµÄÀý×Ó¾ÍÊÇGAPRoleÈÎÎñµÄÈÎÎñº¯Êý£º
if (ICall_fetchServiceMsg(&src, &dest, (void **)&pMsg) == ICALL_ERRNO_SUCCESS) {
if ((src == ICALL_SERVICE_CLASS_BLE) && (dest == selfEntity)) {
ICall_Event *pEvt = (ICall_Event *)pMsg; // Check for BLE stack events first if (pEvt->signature == 0xffff)
{
if (pEvt->event_flag &GAP_EVENT_SIGN_COUNTER_CHANGED) {
// Sign counter changed, save it to NV
VOID osal_snv_write(BLE_NVID_SIGNCOUNTER, sizeof(uint32_t), &gapRole_signCounter);
} } else {
// Process inter-task message
gapRole_processStackMsg((ICall_Hdr *)pMsg); } }
if (pMsg)
{
ICall_freeMsg(pMsg);
} }
×¢ÒâÉÏÃæµÄ´úÂ룬Èç¹ûʼþÀ´×ÔÓÚBLEÐÒéÕ»pEvt->signature ½«×ÜÊǵÈÓÚ0xFFFF¡£
µ±ÎªÁËÒ»¸öÄÚ²¿Ê¼þÑ¡ÔñÁËÒ»¸öʼþֵʱ£¬Õâ¸öÖµ¶ÔÓÚÈÎÎñ±ØÐëÊÇΨһµÄ²¢ÇÒ±ØÐëÊǶàÓÚ2µÄ(Òò´ËÖ»ÐèÉèÖÃÒ»¸öλ)¡£ÓÉÓÚpEvt->event±äÁ¿ÊÇÒÔuint16_t³õʼ»¯µÄ£¬ËùÒÔ×î´óÔÊÐí16¸öʼþ¡£ÄÇЩÒѾÓÃÓÚBLE OSAL È«¾ÖʼþµÄʼþÖµÊDz»ÄÜÔÙÓõġ£
/********************************************************************* * BLE OSAL GAP GLOBAL Events */
#define GAP_EVENT_SIGN_COUNTER_CHANGED 0x4000 //!< The device level sign counter changed
×¢ÒâÕâЩÄÚ²¿ÈÎÎñÊÇһЩÁÐÓë4.2.3.2ÖÐÌáµ½µÄÄÚ²¿ÈÎÎñʼþ²»Í¬µÄʼþ¡£ 4.3.2.2 ·¢Ë͵½Ó¦ÓÃÈÎÎñµÄRTOS¶ÓÁÐÖеÄÏûÏ¢
5. // If RTOS queue is not empty, process app message. 6. if (!Queue_empty(appMsgQueue)) 7. {
8. sbpEvt_t *pMsg = (sbpEvt_t *)Util_dequeueMsg(appMsgQueue); 9. if (pMsg)
10. {
// Process message.
SimpleBLEPeripheral_processAppMsg(pMsg); // Free the space from the message. ICall_free(pMsg); }
1. }
ÕâЩÏûÏ¢ÓÃSimpleBLEPeripheral_enqueueMsg()º¯ÊýÅÅÐò¡£ÒòΪËüÃDZ»·¢Ë͵½¶ÓÁÐÖУ¬µ±ËüÃÇ·¢ËÍʱ»á±»´¦Àí¡£Ò»¸öÕâ·½ÃæµÄͨÓõÄÀý×Ó¾ÍÊÇÔڻص÷º¯ÊýÖнÓÊÕµ½Ò»¸öʼþ£¨ÔĶÁ5.3.4.2.4Õ£©¡£
4.3.2.3 ͨ¹ýÄÚ²¿Ê¼þÖµ·¢Ë͵Äʼþ
5. if (events &SBP_PERIODIC_EVT) 6. {
7. events &= ~SBP_PERIODIC_EVT; 8. Util_startClock(&periodicClock); 9. // Perform periodic application task 10. SimpleBLEPeripheral_performPeriodicTask(); 11. }
ÕâЩ·¢Ë͸øÓ¦ÓÃÈÎÎñµÄͬ²½Ê¼þÊÇͨ¹ýÉèÖÃÓ¦ÓÃÈÎÎñµÄeventsµÄÖµµÄÏà¹ØÎ»ÊµÏֵģ¬Ã¿¸öλ¶ÔÓ¦×ÅÒ»¸ö¶¨ÒåºÃµÄʼþ£¬±ÈÈ磺
// Internal Events for RTOS application #define SBP_STATE_CHANGE_EVT 0x0001 #define SBP_CHAR_CHANGE_EVT 0x0002 #define SBP_PERIODIC_EVT 0x0004
º¯ÊýÔÚÉèÖÃÕâЩʼþÖµµÄλʱ±ØÐëÈ·±£·¢Ë͸øÐÅºÅÆìÀ´¼¤»îÓ¦ÓÃÀ´Ö´ÐС£Õâ·½ÃæµÄÀý×Ó¾ÍÊÇʱÖÓ´¦Àíº¯ÊýÓÃÀ´´¦ÀíʱÖӵij¬Ê±¡£Õⲿ·ÖµÄÃèÊöÔÚ3.4.2ÖС£
×¢Òâµ±Ìí¼ÓÒ»¸öʼþʱ£¬¶ÔÓÚ¸ø¶¨µÄÈÎÎñÆäÖµ±ØÐëÊÇΨһµÄ²¢ÇÒ±ØÐë¶àÓÚ2£¨ÕâÑù¾Í¿ÉÒÔÖ»ÓÐÒ»¸öλ¿ÉÒÔÉèÖã©¡£ÓÉÓÚevents±äÁ¿Êǰ´ÕÕuint16_t³õʼ»¯Òò´Ë×î¶à¿ÉÒÔ¶¨Òå16¸öÄÚ²¿Ê¼þ¡£ 4.3.3 »Øµ÷
Ó¦ÓôúÂëͬÑùÒ²°üº¬Á˸÷ÖÖ¸øÐÒé²ã¡¢profileºÍRTOSÄ£¿éµÄ»Øµ÷º¯Êý¡£ÎªÁËÈ·±£Ï̵߳ݲȫ£¬ÔÚÒ»¸öÈ·ÇеĻص÷º¯ÊýÖÐÓ¦¸Ã½øÐÐ×îСµÄ´¦Àí£¬´óÁ¿µÄ´¦ÀíÓ¦¸ÃÔÚÓ¦ÓõÄÉÏÏÂÎÄÖÐÍê³É¡£Òò´Ëÿ¸ö»Øµ÷º¯Êýͨ³£¶¼¶ÔÓ¦Á½¸öº¯Êý£¨²Î¿¼GAPRole״̬¸Ä±ä»Øµ÷º¯Êý£©£º 1. È·ÇеĻص÷º¯Êý£ºÕâ¸öº¯ÊýÔÚµ÷Óú¯ÊýµÄÉÏÏÂÎÄÖе÷Óã¨ÈçGAPRoleÈÎÎñ£©¡£ÎªÁËÔÚµ÷
ÓÃÉÏÏÂÎÄÖнøÐÐ×îСµÄ´¦Àí£¬ËùÓÐÕâ¸öº¯ÊýµÄÓ¦¸Ã½«Ò»¸öʼþÅÅÁе½Ó¦ÓöÓÁÐÖнøÐд¦Àí¡£
static void SimpleBLEPeripheral_stateChangeCB(gaprole_States_t newState) {
SimpleBLEPeripheral_enqueueMsg(SBP_STATE_CHANGE_EVT, newState); }
2. ÔÚÓ¦ÓÃÉÏÏÂÎÄÖнøÐеĺ¯Êý£ºµ±Ó¦Óñ»»Øµ÷º¯ÊýµÄÅÅÐò»½ÐѺó£¬Õâ¸öº¯Êý¾Í»áÔÚʼþͨ
¹ýÓ¦ÓöÓÁз¢Ëͺʹ¦ÀíÖ®ºó±»µ÷Óá£
static void SimpleBLEPeripheral_processStateChangeEvt(gaprole_States_t newState) {