日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

helloworld簡單示例

更正文檔

案例介紹

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

  • 系統板級初始化

  • 內核基礎組件初始化

  • application_start用戶入口

  • 串口打印輸出

  • 循環睡眠打印該示例的運行依賴下述基本功能完成對接:

  • uart串口

  • 內核的任務和中斷運行正常

  • 系統tick定時器正常運行即helloworld_demo這個示例運行,代碼系統的任務調度tick調度以及串口打印功能已經OK。

基礎知識

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 硬件

HaaS 100 硬件規格

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);
    };
}

其中系統能夠正常打印代表uart功能正常;能夠循環1S打印代表tick中斷以及任務切換功能正常。

4.3 編譯下載

開發環境的搭建請參考《AliOS Things集成開發環境使用說明之搭建開發環境》,其中詳細的介紹了AliOS Things 3.3的IDE集成開發環境的搭建流程。

helloworld_demo的代碼下載請參考《AliOS Things集成開發環境使用說明之創建工程》

> 選擇解決方案:“helloworld簡單示例”

> 選擇開發板:Haas100 board configure

-- 編譯固件可參考《AliOS Things集成開發環境使用說明之編譯固件》

-- 燒錄固件可參考《AliOS Things集成開發環境使用說明之燒錄固件》

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: master
  - vfs: master

至于ramfs本身依賴的組件,則在ramfs自身的YAML中需要添加完全。

  • 在helloworld_demo的app入口helloworld.c中添加ramfs頭文件引用以及初始化函數調用,如下圖,先注冊一個根目錄為/test的ramfs:

  • 添加功能調用示例:

 #include <fcntl.h>
    #include <sys/types.h>
    #include <unistd.h>
    #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);
    if(ret < 0){
        printf("ramfs read fail!\r\n");
        return ret;
    }
    if(strncmp(readbuf, teststring, 5)){
        printf("ramfs test fail! readbuf:%s\r\n",readbuf);
    }else{
        printf("ramfs test success!\r\n");
    }
    ramfs_unregister("/test");

由于使用了標準文件系統的O_RDWR相關定義,需要包含#include "fcntl.h"。

  • 編譯、運行

aos make helloworld_demo@haas100 -c config
aos make

運行效果:

             Welcome to AliOS Things
nano entry here!
ramfs test success!
hello world! count 0
hello world! count 1
hello world! count 2
hello world! count 3

6. 總結

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