前言
因为网上资料不全,很多地方都对不上,比如官方的例程是这样的
而我们用Iot-studio创建出来的确实下面这个样子。
当我们点击该函数的定义的,却显示未找到结果
我在学习NB-Iot的时候,有些地方不懂,所以写下这篇博客研究一下。
任务函数osal_task_create
我们先看osal_task_create的定义
参数 | 说明 |
---|---|
osal_task_create | 任务创建 |
const char *name | 任务名称 |
int (*task_entry)(void *args) | 任务函数入口地址 |
void *args | 参数 |
int stack_size | 任务栈大小 |
void *stack | 任务栈指针 |
int prior | 任务优先级 |
这些给的都是任务控制块PCB的一些参数。
Huawei LiteOS 系统中提供的内存管理 API 都是以 LOS 开头,但是这些 API 使用起来比较复杂,所以本文中我们使用
Huawei IoT Link SDK 提供的统一API接口进行实验,这些接口底层已经使用 LiteOS提供的API实现,对用户而言更为简洁。
定时器stimer_create
函数调用
先看最后一个参数,如果定义了flag,跟cn_stimer_flag_start按位与,这里如果为真(可能也相同),那么应该是一个定时函数,定时时间为cycle,否则是执行一次就停止的。
引用[野火]《物联网操作系统 LiteOS开发实战指南—基于STM32》的图
参数 | 说明 |
---|---|
stimer_create | 定时器创建 |
const char *name | 定时器名称 |
fn_stimer_handler handler | 回调函数 |
void *args | 参数 |
uint32_t cycle | 周期时间 |
uint32_t flag | 周期还是单次 |
按键中断
外部中断线
参数 | 说明 |
---|---|
osal_int_connect | 中断创建 |
intnum | 外部中断线 |
prio | 中断优先级 |
mode | 硬件中断模式 |
uint32_t cycle | 中断回调函数 |
arg | uwArg 是触发硬件中断时使用的中断处理程序的输入参数 |
中断回调函数
这里传递了一个GPIO_Pin的引脚的参数,然后根据引脚不同,执行的动作也不同。(#define KEY1_Pin GPIO_PIN_2)
扫描二维码关注公众号,回复:
11237378 查看本文章
部分源码流程
// 把消息放到缓冲区里面
//之前设置了收到云平台消息的回调函数指向app_msg_deal
static int app_msg_deal(void *usr_data, en_oc_lwm2m_msg_t type, void *data, int len)
{
unsigned char *msg;
msg = data;
int ret = -1;
if (len <= cn_app_rcv_buf_len)
{
//oc的回复消息,只需要知道就行
if (msg[0] == 0xaa && msg[1] == 0xaa)
{
printf("OC respond message received! \n\r");
return ret;
}
//释放信号量,缓存信息
memcpy(s_rcv_buffer, msg, len);
s_rcv_datalen = len;
osal_semp_post(s_rcv_sync);
ret = 0;
}
return ret;
}
int standard_app_demo_main()
{
// Huawei IoT Link SDK
osal_semp_create(&s_rcv_sync, 1, 0);
osal_task_create("app_collect", app_collect_task_entry, NULL, 0x400, NULL, 3);
osal_task_create("app_report", app_report_task_entry, NULL, 0x1000, NULL, 2);
osal_task_create("app_command", app_cmd_task_entry, NULL, 0x1000, NULL, 3);
//按键中断
// int intnum, int prio, int mode, fn_interrupt_handle callback, void *arg
osal_int_connect(KEY1_EXTI_IRQn, 2, 0, Key1_IRQHandler, NULL);
osal_int_connect(KEY2_EXTI_IRQn, 3, 0, Key2_IRQHandler, NULL);
//(const char *name,fn_stimer_handler handler, void *arg,uint32_t cycle,uint32_t flag)
stimer_create("lcdtimer", timer1_callback, NULL, 8 * 1000, cn_stimer_flag_start);
return 0;
}
参考文章
流程和AT指令讲得身份详细 NB模组软件开发流程指南