摘要:本文基於小熊派開發板簡單介紹瞭如何在LiteOS中移植感測器,從而實現對於感測器的相關控制。
相信大家無論在學習程式語言開始的第一個函數應該是HelloWorld,本文將從hello_world_demo為大家介紹如何實現感測器的移植工作。
首先我們建立HelloWorld工程,選擇STM32_BearPi → hello_world_demo,工程名稱可以自定義。
建立之後我們點選編譯,然後燒錄到開發板,開啟VSCode-IoTLink的串列埠,並按照圖中進行設定串列埠連線引數,之後按鍵Reset,可以看到串列埠列印如下圖所示。
首先來介紹一下程式碼執行的簡單流程,之前在漫談LiteOS系列中介紹過LiteOS 的啟動流程,我們知道在程式下載到開發板之後,首先會按一下Reset按鍵進行開發板的啟動,因此在開發板上電之後執行的第一個函數就是ReSet_Handler函數。
首先找到對應的啟動檔案los_startup.S 檔案(根據使用的作業系統以及板子MCU系列查詢檔案目錄),可以看到其由組合語言編寫,具體啟動流程在漫談LiteOS系列中已經介紹過,這裡只看低91行,執行到main函數,接下來程式將從main函數開始執行。
接下來看main函數,在main函數中,從硬體初始化到核心初始化,之後初始化串列埠,再到link_test()函數,在該函數中建立了一個任務,其入口函數為Link_main函數。
在Link_main函數的最後呼叫了一個函數為standard_app_demo_main(),根據IDE查詢我們可以看到,在專案中存在大量的該同名函數,那麼編譯器如何知道具體執行的是哪一個呢,可以看到.config檔案中的user_demo宏定義使能的是hello_world_demo,因此執行的是hello_world_demo中的standard_app_demo_main()函數,從而根據其內部建立的任務以及入口函數實現了列印Hello World! This is BearPi!。接下來我們進行感測器的移植。
首先我們可以看到在該LiteOS程式碼中已經包含了大量的感測器程式碼,這裡以E53_SC1為例,當然這些感測器已經和BearPi開發板已經適配好,如果您想使用自己特定的感測器,可以首先將感測器與開發板進行一定的移植,包括引腳以及GPIO的繫結等等。
首先需要將感測器檔案路徑新增到編譯路徑中,以使得編譯器可以找到該程式碼,在userdemo.mk中設定感測器檔案的相關路徑,在該檔案中找到hello_world_demo部分新增檔案路徑。具體如下圖83-84行,接著在原始檔和標頭檔案變數中新增自定義的變數,user_sensor_src和user_hardware_inc,當然這裡如果您直接定義名稱為編譯路徑中已經存在的user_hardware_src和user_hardware_inc,則無需新增相關程式碼。
首先我們需要新增感測器標頭檔案到helloworld_demo.c中,以實現後面的相關函數呼叫。
#include "E53_SC1.h"
之後呼叫結構體,以便後續列印資料。
E53_SC1_Data_TypeDef E53_SC1_Data;
然後在hello_world_demo.c檔案中,新增感測器資料的任務函數。
static int app_sensor_entry()
{
Init_E53_SC1();
while (1)
{
E53_SC1_Read_Data();
printf("luminance:%d\n", (int)E53_SC1_Data.Lux);
osal_task_sleep(2*1000);
}
return 0;
}
在主函數中建立感測器任務函數。
osal_task_create("app_sensor_entry", app_sensor_entry, NULL, 0x400,NULL,2);
osal_task_sleep(2*1000);
具體如下圖
之後我們編譯燒錄,通過串列埠驗證一下感測器的移植是否正確。