天天看點

AliOS Things 3.3.0 第一個示例: helloworld1. 案例簡介2. 基礎知識3. 物料清單4. 案例實作5 添加新元件6. 總結開發者技術支援

1. 案例簡介

helloworld_demo是我們提供的最簡化的運作執行個體,該app從字面上來看功能也比較簡單,即完成**hello world!**的關鍵字元輸出,以表明系統初始化完成并能夠正常輸出。但是雖然功能看似簡單單一,該app能夠運作成功,即代碼核心小系統以及基本的列印輸出功能即正常運作。 其完成的主要功能包括:

  • 系統闆級初始化
  • 核心基礎元件初始化
  • application_start使用者入口
  • 序列槽列印輸出
  • 循環睡眠列印 該示例的運作依賴下述基本功能完成對接:
  • uart序列槽
  • 核心的任務和中斷運作正常
  • 系統tick定時器正常運作 即helloworld_demo這個示例運作,代碼系統的**任務排程**、**tick排程**以及**序列槽列印功能**已經OK。

2. 基礎知識

2.1 基礎目錄結構

  1. .
  2. ├── helloworld.c # 該solution核心列印輸出代碼,入口**application_start**
  3. ├── k_app_config.h # 核心元件的配置開關,優先級低于**k_config.h**
  4. ├── maintask.c # 系統主任務入口處理,入口**aos_maintask**
  5. ├── Makefile # aos make編譯時入口
  6. ├── package.yaml # 編譯系統配置檔案
  7. └── SConstruct # Makefile => Scon => aostools

2.2 基本規範

solution統一以**aos_maintask**作為入口函數,從具體單闆的C入口main函數開始,通過建立一個主任務來執行,即aos_maintask是系統主任務的入口函數:

  1. static void aos_main_task_entry(void)
  2. {
  3. ......
  4. aos_maintask();
  5. }
  6. /* main一般為單闆的C程式入口 */
  7. int main(void)
  8. 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);
  9. while (1) {
  10. krhino_task_sleep(100);

aos_maintask内實作包括闆級初始化**board_init**、基礎元件初始化**aos_components_init**、以及app入口**application_start**

  1. /* For user config
  2. kinit.argc = 0;
  3. kinit.argv = NULL;
  4. kinit.cli_enable = 1;
  5. */
  6. static kinit_t kinit = {0, NULL, 1};
  7. void board_init(void)
  8. board_tick_init(); // tick闆級初始化,實作在具體board目錄内
  9. board_stduart_init(); // uart序列槽初始化,實作在具體board目錄内
  10. board_dma_init(); // 如果使用dma相關初始化,沒有置空
  11. board_gpio_init(); // gpio的時鐘等初始化,沒有可置空
  12. void aos_maintask(void* arg)
  13. board_init();
  14. board_kinit_init(&kinit); // 給系統參數指派,可使用預設值
  15. aos_components_init(&kinit); // 系統基礎元件的初始化
  16. #ifndef AOS_BINS
  17. application_start(kinit.argc, kinit.argv); // app的實際實作入口
  18. #endif

其中為了統一不同單闆的闆級初始化,新增單闆需要統一支援board_init内各闆級子產品初始化,如果沒有相關函數可以實作為空; 對于helloworld功能比較簡單,一般需要tick和uart的初始化即可;而對于複雜的app,即需要初始化的子產品則按照實際情況來增加,對應實作在具體board中添加,如:

  1. void board_stduart_init(void)
  2. void board_tick_init(void)
  3. void board_flash_init(void)
  4. void board_network_init(void)
  5. void board_gpio_init(void)
  6. void board_wdg_init(void)
  7. void board_ota_init(void)
  8. void board_dma_init(void)

對于aos_components_init,其完成了一些基礎元件如vfs、cli、kv等基礎中間件的初始化,并通過元件宏開關,一旦相應該基礎元件子產品被加入編譯,則aos_components_init即進行相關子產品的初始化。 application_start是實際solution的實作,即app的統一入口。

2.3 基本運作流程

AliOS Things 3.3.0 第一個示例: helloworld1. 案例簡介2. 基礎知識3. 物料清單4. 案例實作5 添加新元件6. 總結開發者技術支援

3. 物料清單

3.1 HaaS100 硬體

HaaS100 硬體簡介
AliOS Things 3.3.0 第一個示例: helloworld1. 案例簡介2. 基礎知識3. 物料清單4. 案例實作5 添加新元件6. 總結開發者技術支援

4. 案例實作

4.1 硬體連接配接

該案例隻需要連接配接電源線以及序列槽線,如下圖所示:

AliOS Things 3.3.0 第一個示例: helloworld1. 案例簡介2. 基礎知識3. 物料清單4. 案例實作5 添加新元件6. 總結開發者技術支援

4.2 軟體實作

application_start實際app入口内實作較簡單,主要包括:

  • 基本的序列槽列印
  • while循環睡眠10S列印計數 代碼如下:
    1. int application_start(int argc, char *argv[])
    2. int count = 0;
    3. printf("nano entry here!\r\n");
    4. while(1) {
    5. printf("hello world! count %d \r\n", count++);
    6. aos_msleep(10000);
    7. };
    其中系統能夠正常列印代表uart功能正常;能夠循環1S列印代表tick中斷以及任務切換功能正常。

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 序列槽輸出效果

  1. Welcome to AliOS Things
  2. nano entry here!
  3. hello world! count 0
  4. hello world! count 1
  5. hello world! count 2
  6. hello world! count 3
  7. hello world! count 4
  8. hello world! count 5
  9. hello world! count 6

5 添加新元件

helloworld_demo作為一個基礎元件,其本身依賴的元件相對較少,主要包括核心基礎代碼、cli以及單闆和mcu相關的元件。 使用者可以基于此solution作為參考,來開發屬于自己的app。 如期望在helloworld_demo中增加ramfs檔案系統的元件功能,操作步驟如下:

5.1 yaml增加元件

  • 在helloworld_demo的yaml檔案中添加元件依賴ramfs。由于需要使用标準vfs接口,是以還需要加上vfs元件。
    1. depends:
    2. - ramfs: rel_3.3.0
    3. - vfs: rel_3.3.0
    至于ramfs本身依賴的元件,則在ramfs自身的yaml中需要添加完全。
  • 在helloworld_demo的app入口helloworld.c中添加ramfs頭檔案引用以及初始化函數調用, 如下圖,先注冊一個根目錄為**/test**的ramfs:
AliOS Things 3.3.0 第一個示例: helloworld1. 案例簡介2. 基礎知識3. 物料清單4. 案例實作5 添加新元件6. 總結開發者技術支援
  • 添加功能調用 示例:
    1. #include
    2. #include "ramfs.h"
    3. int fd;
    4. int ret;
    5. char teststring = "1234";
    6. char readbuf[10];
    7. ramfs_register("/test");
    8. fd = open("/test/file1", O_RDWR);
    9. if(fd < 0){
    10. printf("ramfs open fail!\r\n");
    11. return fd;
    12. ret = write(fd, teststring, 5);
    13. if(ret < 0){
    14. printf("ramfs write fail!\r\n");
    15. return ret;
    16. lseek(fd, 0, SEEK_SET);
    17. ret = read(fd, readbuf, 5);
    18. printf("ramfs read fail!\r\n");
    19. if(strncmp(readbuf, teststring, 5)){
    20. printf("ramfs test fail! readbuf:%s\r\n",readbuf);
    21. }else{
    22. printf("ramfs test success!\r\n");
    23. ramfs_unregister("/test");
    由于使用了标準檔案系統的O_RDWR相關定義,需要包含::include "fcntl.h"
  • 編譯、運作
  1. aos make helloworld_demo@haas100 -c config
  2. aos make

運作效果:

  1. ramfs test success!

6. 總結

helloworld_demo雖然代碼較少,但是其完成了一個最小系統需要的基本功能,包括:核心啟動、任務切換、tick中斷,以及序列槽輸出。一般作為單闆移植的基本solution來參考對接; 同時,還可以此solution為基礎,開始添加使用者需要的其他元件,并定制修改自身需要的APP。

開發者技術支援

如需更多技術支援,可加入釘釘開發者群,或者關注微信公衆号

AliOS Things 3.3.0 第一個示例: helloworld1. 案例簡介2. 基礎知識3. 物料清單4. 案例實作5 添加新元件6. 總結開發者技術支援

更多技術與解決方案介紹,請通路阿裡雲AIoT首頁

https://iot.aliyun.com/