源码资源:
https://github.com/Gabrielle-OyO/AliOS-Things-rel_3.1.0/tree/main/AliOS
项目仓库:
https://github.com/Gabrielle-OyO/AliOS-Things-Term
1、下载相应软件完成AliOS开发环境的搭建,并成功编译hello world例程,将环境搭建过程及程序运行结果截图,并简单分析该程序所实现的功能。
这里使用XCOM串口监视器:
https://github.com/Gabrielle-OyO/AliOS-Things-Term/tree/main/XCOM%20V2.0
进入alios代码源指定文件夹的根目录:
cd C:\Repository\AliOS-Things-rel_3.1.0
生成默认配置:helloworld.c 到 esp32devkitc 板子上
aos make helloworld@esp32devkitc -c config
编译文件
aos make
烧录文件
aos upload helloworld@esp32devkitc
选择串口
--- Enter port index or full name: 1
记得按Boot键
烧录成功
打开串口监视器,查看结果
/*
* Copyright (C) 2015-2017 Alibaba Group Holding Limited
*/
#include <stdio.h>
#include <aos/kernel.h>
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(1000);
};
}
2、掌握AliOS程序代码的结构,简述AliOS程序代码的启动流程,启动过程中程序做了哪些工作。(通过分析源代码回答,可以使用sourceinsight软件分析源代码)。
• ESP32—ESP-IDF芯片的程序启动过程:
文件路径:
• app_main()—AliOS-Things-rel_3.1.0\platform\mcu\esp32\bsp\entry.c
• app_entry()—AliOS-Things-rel_3.1.0\platform\mcu\esp32\bsp\entry.c
• application_start()
这里使用sourceinsight工具进行代码分析:
https://github.com/Gabrielle-OyO/AliOS-Things-Term/blob/main/sourceinsight4.rar
3、设计程序,创建3个任务,优先级分别为35、34、33,每个任务分别打印“task1 run!”, “task2 run!”,“task3 run!”,打印完后休眠r1秒钟时间,然后再次打印。要求3个任务使用同一个任务函数,通过传入不同的字符串参数,实现不同内容的打印。
(1)实现程序,观察输出结果,说明任务如何调度运行,为什么?
/*
* Copyright (C) 2015-2017 Alibaba Group Holding Limited
*/
#include <k_api.h>
#include <stdio.h>
#include <aos/kernel.h>
//定义函数
aos_task_t task1;
aos_task_t task2;
aos_task_t task3;
//循环输出
void func(void * arg)
{
while(1)
{
printf("%s\r\n",(char*)arg);
aos_msleep(1000);
}
}
int application_start(int argc, char *argv[])
{
int tmp=0;
printf("nano entry here!\r\n");
aos_task_new_ext(&task1,"task1", func,(void*)"task1 run!", 8192,35);//优先级最低,最后输出
aos_task_new_ext(&task2,"task2", func,(void*)"task2 run!", 8192,34);//优先级其次
aos_task_new_ext(&task3,"task3", func,(void*)"task3 run!", 8192,33);//优先级最高,首先输出
while(1) {
printf("maintask print %d\r\n",tmp);
tmp++;
aos_msleep(1000);
};
}
(2)在(1)的基础上,当程序运行一段时间后,挂起任务2,输出有什么改变?运行一段时间后再恢复任务2,输出有什么变化?
循环输出8次任务1、2、3;挂起任务2;循环输出10次任务1、2;恢复任务2;循环输出任务1、2、3
/*
* Copyright (C) 2015-2017 Alibaba Group Holding Limited
*/
#include <k_api.h>
#include <stdio.h>
#include <aos/kernel.h>
aos_task_t htask1;
aos_task_t htask2;
aos_task_t htask3;
void func(void * arg)
{
while(1)
{
printf("%s\r\n",(char*)arg);
aos_msleep(1000);
}
}
int application_start(int argc, char *argv[])
{
int tmp=0;
printf("nano entry here!\r\n");
aos_task_new_ext(&htask1,"task1", func,(void*)"task1 run!", 8192,35);
aos_task_new_ext(&htask2,"task2", func,(void*)"task2 run!", 8192,34);
aos_task_new_ext(&htask3,"task3", func,(void*)"task3 run!", 8192,33);
while(1) {
printf("maintask print %d\r\n",tmp);
tmp++;
if(tmp==10)
krhino_task_suspend((ktask_t *)(htask2.hdl));//挂起任务2
if(tmp==20)
krhino_task_resume((ktask_t *)(htask2.hdl));//恢复任务2
aos_msleep(1000);
};
}
(3)在(1)的基础上,将3个任务的优先级都改为33,观察输出结果,说明任务如何调度运行,为什么?
按照语句顺序输出,优先级相同
/*
* Copyright (C) 2015-2017 Alibaba Group Holding Limited
*/
#include <k_api.h>
#include <stdio.h>
#include <aos/kernel.h>
//定义函数
aos_task_t task1;
aos_task_t task2;
aos_task_t task3;
//循环输出
void func(void * arg)
{
while(1)
{
printf("%s\r\n",(char*)arg);
aos_msleep(1000);
}
}
int application_start(int argc, char *argv[])
{
int tmp=0;
printf("nano entry here!\r\n");
aos_task_new_ext(&task1,"task1", func,(void*)"task1 run!", 8192,33);
aos_task_new_ext(&task2,"task2", func,(void*)"task2 run!", 8192,33);
aos_task_new_ext(&task3,"task3", func,(void*)"task3 run!", 8192,33);
while(1) {
printf("maintask print %d\r\n",tmp);
tmp++;
aos_msleep(1000);
};
}
4、将RHINO_CONFIG_TIME_SLICE_DEFAULT定义为不同的值,说明在同优先级任务调度时,该宏的作用?自己设计程序,通过程序输出结果说明。
默认优先级,值越大优先级越低
/*
* Copyright (C) 2015-2017 Alibaba Group Holding Limited
*/
#include <stdio.h>
#include <aos/kernel.h>
volatile int count1=0;
volatile int count2=0;
aos_task_t htask1;
aos_task_t htask2;
void func1(void * arg)
{
while(1)
count1++;
}
void func2(void * arg)
{
while(1)
count2++;
}
int application_start(int argc, char *argv[])
{
printf("nano entry here!\r\n");
aos_task_new_ext(&htask1,"task1", func1,0, 8192,33);
aos_task_new_ext(&htask2,"task2", func2,0, 8192,33);
while(1) {
printf("count1=%d,count2=%d\r\n",count1,count2);
aos_msleep(1000);
};
}