1. 程式人生 > 實用技巧 >小熊派開發實踐丨漫談LiteOS之感測器移植

小熊派開發實踐丨漫談LiteOS之感測器移植

摘要:本文基於小熊派開發板簡單介紹瞭如何在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);

具體如下圖

之後我們編譯燒錄,通過串列埠驗證一下感測器的移植是否正確。

點選關注,第一時間瞭解華為雲新鮮技術~