摘要:本文基於小熊派開發板簡單介紹了如何在LiteOS中移植傳感器,從而實現對於傳感器的相關控制。
1 hello world
相信大家無論在學習編程語言開始的第一個函數應該是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!。接下來我們進行傳感器的移植。
2 傳感器移植
首先我們可以看到在該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);
具體如下圖
之后我們編譯燒錄,通過串口驗證一下傳感器的移植是否正確。