基于小熊派的NB-IOT智慧路灯(二)

前言

工程代码

因为网上资料不全,很多地方都对不上,比如官方的例程是这样的
基于小熊派的NB-IOT智慧路灯(二)_第1张图片
而我们用Iot-studio创建出来的确实下面这个样子。

在这里插入图片描述
当我们点击该函数的定义的,却显示未找到结果
基于小熊派的NB-IOT智慧路灯(二)_第2张图片
我在学习NB-Iot的时候,有些地方不懂,所以写下这篇博客研究一下。




任务函数osal_task_create

我们先看osal_task_create的定义
基于小熊派的NB-IOT智慧路灯(二)_第3张图片
在这里插入图片描述
基于小熊派的NB-IOT智慧路灯(二)_第4张图片

参数 说明
osal_task_create 任务创建
const char *name 任务名称
int (*task_entry)(void *args) 任务函数入口地址
void *args 参数
int stack_size 任务栈大小
void *stack 任务栈指针
int prior 任务优先级

这些给的都是任务控制块PCB的一些参数。
基于小熊派的NB-IOT智慧路灯(二)_第5张图片

Huawei LiteOS 系统中提供的内存管理 API 都是以 LOS 开头,但是这些 API 使用起来比较复杂,所以本文中我们使用
Huawei IoT Link SDK 提供的统一API接口进行实验,这些接口底层已经使用 LiteOS提供的API实现,对用户而言更为简洁。




定时器stimer_create

函数调用
在这里插入图片描述
基于小熊派的NB-IOT智慧路灯(二)_第6张图片
先看最后一个参数,如果定义了flag,跟cn_stimer_flag_start按位与,这里如果为真(可能也相同),那么应该是一个定时函数,定时时间为cycle,否则是执行一次就停止的。

引用[野火]《物联网操作系统 LiteOS开发实战指南—基于STM32》的图
基于小熊派的NB-IOT智慧路灯(二)_第7张图片

参数 说明
stimer_create 定时器创建
const char *name 定时器名称
fn_stimer_handler handler 回调函数
void *args 参数
uint32_t cycle 周期时间
uint32_t flag 周期还是单次



按键中断

基于小熊派的NB-IOT智慧路灯(二)_第8张图片
在这里插入图片描述
外部中断线

基于小熊派的NB-IOT智慧路灯(二)_第9张图片

参数 说明
osal_int_connect 中断创建
intnum 外部中断线
prio 中断优先级
mode 硬件中断模式
uint32_t cycle 中断回调函数
arg uwArg 是触发硬件中断时使用的中断处理程序的输入参数

中断回调函数

基于小熊派的NB-IOT智慧路灯(二)_第10张图片
这里传递了一个GPIO_Pin的引脚的参数,然后根据引脚不同,执行的动作也不同。(#define KEY1_Pin GPIO_PIN_2)




部分源码流程

基于小熊派的NB-IOT智慧路灯(二)_第11张图片
基于小熊派的NB-IOT智慧路灯(二)_第12张图片

// 把消息放到缓冲区里面
//之前设置了收到云平台消息的回调函数指向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模组软件开发流程指南

你可能感兴趣的:(小熊派)