BLE程序框架探索
在這篇文章里我主要探究SoftDevice程序是怎么嵌入到BLE程序中的,研究一下BLE程序框架:
在函數softdevice_handler_init中有這樣的一句調用語句:
? ?? ???err_code = sd_softdevice_enable(clock_source, softdevice_assertion_handler);
我們就從這句話入手:
? ?? ???全局搜索sd_softdevice_enable可以在Include\s110\nrf_sdm.h文件里看到這回句話:
? ?? ???SVCALL(SD_SOFTDEVICE_ENABLE, uint32_t, sd_softdevice_enable(nrf_clock_lfclksrc_t clock_source, softdevice_assertion_handler_t assertion_handler));
再看看SVCALL函數,可以跳到Include\s110\nrf_svc.h的這個地方:
? ?? ?? ?#ifndef SVCALL
? ?? ?? ?#if defined (__CC_ARM)
? ?? ?? ?#define SVCALL(number, return_type, signature) return_type __svc(number) signature
這里的signature就是要調用的函數sd_softdevice_enable,number是傳給svc中斷的一個參數,指定某段程序
整體來考慮可以猜測:
? ?? ???所謂的SD調用是靠svc系統調用中斷來實現的,那么就可以想象真正調用SD函數的代碼就是存在svc中斷里的,但是我們在svc中斷中并沒有找到相應的調用語句,那么就可以猜測所謂的協議棧就是一段放在單片機起始位置的一段很長的代碼,這個代碼中的svc中斷中必定調用了真正的SD程序。那么這個機制就有點像API程序一樣,BLE程序就是應用程序,協議棧就是引導程序。
? ?? ???為了證明我這個猜測,我找到了兩個證據:
? ?? ???1.BLE程序并沒有真正的中斷函數,是用鉤子函數的機制實現用戶中斷的,因為POWER_CLOCK_IRQHandler,RADIO_IRQHandler,-----------這些函數程序里都沒有實現,而定時器初始化卻有這樣的一句話:err_code = app_timer_create(&m_app_timer_id, APP_TIMER_MODE_REPEATED, timer_timeout_handler);那么timer_timeout_handler函數就是鉤子函數
? ?? ???2.程序的開始地址并不是單片機的起始地址,所以我的猜測是對的。
總結
- 上一篇: nRF51822之BootLoader
- 下一篇: SVC和PendSV