1. 案例簡介
helloworld_demo是我們提供的最簡化的運作執行個體,該app從字面上來看功能也比較簡單,即完成**hello world!**的關鍵字元輸出,以表明系統初始化完成并能夠正常輸出。但是雖然功能看似簡單單一,該app能夠運作成功,即代碼核心小系統以及基本的列印輸出功能即正常運作。 其完成的主要功能包括:
- 系統闆級初始化
- 核心基礎元件初始化
- application_start使用者入口
- 序列槽列印輸出
- 循環睡眠列印 該示例的運作依賴下述基本功能完成對接:
- uart序列槽
- 核心的任務和中斷運作正常
- 系統tick定時器正常運作 即helloworld_demo這個示例運作,代碼系統的**任務排程**、**tick排程**以及**序列槽列印功能**已經OK。
2. 基礎知識
2.1 基礎目錄結構
- .
- ├── helloworld.c # 該solution核心列印輸出代碼,入口**application_start**
- ├── k_app_config.h # 核心元件的配置開關,優先級低于**k_config.h**
- ├── maintask.c # 系統主任務入口處理,入口**aos_maintask**
- ├── Makefile # aos make編譯時入口
- ├── package.yaml # 編譯系統配置檔案
- └── SConstruct # Makefile => Scon => aostools
2.2 基本規範
solution統一以**aos_maintask**作為入口函數,從具體單闆的C入口main函數開始,通過建立一個主任務來執行,即aos_maintask是系統主任務的入口函數:
- static void aos_main_task_entry(void)
- {
- ......
- aos_maintask();
- }
- /* main一般為單闆的C程式入口 */
- int main(void)
- krhino_task_dyn_create(&g_main_task, "main_task", 0, OS_MAIN_TASK_PRI, 0, OS_MAIN_TASK_STACK, (task_entry_t)aos_main_task_entry, 1);
- while (1) {
- krhino_task_sleep(100);
aos_maintask内實作包括闆級初始化**board_init**、基礎元件初始化**aos_components_init**、以及app入口**application_start**
- /* For user config
- kinit.argc = 0;
- kinit.argv = NULL;
- kinit.cli_enable = 1;
- */
- static kinit_t kinit = {0, NULL, 1};
- void board_init(void)
- board_tick_init(); // tick闆級初始化,實作在具體board目錄内
- board_stduart_init(); // uart序列槽初始化,實作在具體board目錄内
- board_dma_init(); // 如果使用dma相關初始化,沒有置空
- board_gpio_init(); // gpio的時鐘等初始化,沒有可置空
- void aos_maintask(void* arg)
- board_init();
- board_kinit_init(&kinit); // 給系統參數指派,可使用預設值
- aos_components_init(&kinit); // 系統基礎元件的初始化
- #ifndef AOS_BINS
- application_start(kinit.argc, kinit.argv); // app的實際實作入口
- #endif
其中為了統一不同單闆的闆級初始化,新增單闆需要統一支援board_init内各闆級子產品初始化,如果沒有相關函數可以實作為空; 對于helloworld功能比較簡單,一般需要tick和uart的初始化即可;而對于複雜的app,即需要初始化的子產品則按照實際情況來增加,對應實作在具體board中添加,如:
- void board_stduart_init(void)
- void board_tick_init(void)
- void board_flash_init(void)
- void board_network_init(void)
- void board_gpio_init(void)
- void board_wdg_init(void)
- void board_ota_init(void)
- void board_dma_init(void)
對于aos_components_init,其完成了一些基礎元件如vfs、cli、kv等基礎中間件的初始化,并通過元件宏開關,一旦相應該基礎元件子產品被加入編譯,則aos_components_init即進行相關子產品的初始化。 application_start是實際solution的實作,即app的統一入口。
2.3 基本運作流程

3. 物料清單
3.1 HaaS100 硬體
HaaS100 硬體簡介4. 案例實作
4.1 硬體連接配接
該案例隻需要連接配接電源線以及序列槽線,如下圖所示:
4.2 軟體實作
application_start實際app入口内實作較簡單,主要包括:
- 基本的序列槽列印
- while循環睡眠10S列印計數 代碼如下:
- int application_start(int argc, char *argv[])
- int count = 0;
- printf("nano entry here!\r\n");
- while(1) {
- printf("hello world! count %d \r\n", count++);
- aos_msleep(10000);
- };
4.3 編譯下載下傳
開發環境的搭建請參考 HaaS100_Quick_Start (搭建開發環境章節),其中詳細的介紹了AliOS Things 3.3的IDE內建開發環境的搭建流程。
helloworld_demo的代碼下載下傳請參考 HaaS100_Quick_Start (建立工程章節),
*> 選擇解決方案: “helloworld簡單示例”*
*> 選擇開發闆: Haas100 board configure*
– 參考 HaaS100_Quick_Start (3.1 編譯工程章節),點選 ✅ 即可完成編譯固件。
– 參考 HaaS100_Quick_Start (3.2 燒錄鏡像章節),點選 "⚡️" 即可完成燒錄固件。
4.4 序列槽輸出效果
- Welcome to AliOS Things
- nano entry here!
- hello world! count 0
- hello world! count 1
- hello world! count 2
- hello world! count 3
- hello world! count 4
- hello world! count 5
- hello world! count 6
5 添加新元件
helloworld_demo作為一個基礎元件,其本身依賴的元件相對較少,主要包括核心基礎代碼、cli以及單闆和mcu相關的元件。 使用者可以基于此solution作為參考,來開發屬于自己的app。 如期望在helloworld_demo中增加ramfs檔案系統的元件功能,操作步驟如下:
5.1 yaml增加元件
- 在helloworld_demo的yaml檔案中添加元件依賴ramfs。由于需要使用标準vfs接口,是以還需要加上vfs元件。
- depends:
- - ramfs: rel_3.3.0
- - vfs: rel_3.3.0
- 在helloworld_demo的app入口helloworld.c中添加ramfs頭檔案引用以及初始化函數調用, 如下圖,先注冊一個根目錄為**/test**的ramfs:
- 添加功能調用 示例:
- #include
- #include "ramfs.h"
- int fd;
- int ret;
- char teststring = "1234";
- char readbuf[10];
- ramfs_register("/test");
- fd = open("/test/file1", O_RDWR);
- if(fd < 0){
- printf("ramfs open fail!\r\n");
- return fd;
- ret = write(fd, teststring, 5);
- if(ret < 0){
- printf("ramfs write fail!\r\n");
- return ret;
- lseek(fd, 0, SEEK_SET);
- ret = read(fd, readbuf, 5);
- printf("ramfs read fail!\r\n");
- if(strncmp(readbuf, teststring, 5)){
- printf("ramfs test fail! readbuf:%s\r\n",readbuf);
- }else{
- printf("ramfs test success!\r\n");
- ramfs_unregister("/test");
- 編譯、運作
- aos make helloworld_demo@haas100 -c config
- aos make
運作效果:
- ramfs test success!
6. 總結
helloworld_demo雖然代碼較少,但是其完成了一個最小系統需要的基本功能,包括:核心啟動、任務切換、tick中斷,以及序列槽輸出。一般作為單闆移植的基本solution來參考對接; 同時,還可以此solution為基礎,開始添加使用者需要的其他元件,并定制修改自身需要的APP。
開發者技術支援
如需更多技術支援,可加入釘釘開發者群,或者關注微信公衆号
更多技術與解決方案介紹,請通路阿裡雲AIoT首頁
https://iot.aliyun.com/