SIM800C二次开发(EAT开发)------------(4)APP代码UART浅析

上篇文章中使用的uart做了APP试验,今天对其代码做一下简单的分析,上代码:

解析:

一、文件中的结构体

/*app代码中需要加入APP_CFG段 begin*/

#pragma arm section rodata = "APP_CFG"
APP_ENTRY_FLAG
#pragma arm section rodata
/*EAT app代码中需要加入APP_CFG段 end*/

#pragma arm section rodata="APPENTRY"    // APP函数入口

#pragma arm section rodata    //入口段结束

二、具体任务说明:

EAT_USER_0,EAT_USER_1,EAT_USER_2 …EAT_USER_8 是用户可使用的9个线程,如果在结构体EatEntry_st 数据中的成员被赋值,同时系统没有在升级过程中,则该入口会被调用,同时系统分配task相关的信息。
如下示例,app_main,app_func_ext1,app_user1,app_user3会被调用:
const EatEntry_st AppEntry =
{
app_main,
app_func_ext1,
(app_user_func)app_user1,//app_user1,
(app_user_func)app_user2,//app_user2,
(app_user_func)app_user3,//app_user3,
(app_user_func) EAT_NULL,//app_user4,
(app_user_func) EAT_NULL,//app_user5,
(app_user_func) EAT_NULL,//app_user6,
(app_user_func) EAT_NULL,//app_user7,
(app_user_func) EAT_NULL,//app_user8,
……
};

三、多线程功能描述

平台提供多线程功能,目前支持1个主线程和最多8个子线程,主线程用于和系统通信,如接收系统事件。
高优先级的suspend的线程,在满足运行条件时,会优于正在运行的低优先级的线程得到调度。

系统启动后先检测是否存在app_main存在,若存在则休眠3秒,然后进行EAT 模块初始化,进入app_main函数内

在Msg loop内循环。紧接着,系统检测是否存在app_user函数且不在升级的情况下,若存在则休眠3.1秒,然后进入app_user1

函数等待线程内的事件触发。其他app_user依次类推。

uart文件中,APP函数启动步骤如上图所示,先进行app_main的初始化,再进入app_func_ext1,然后最后进入app_user1

进行运行。此时app_main和app_user1两处线程共同在等待事件的触发。

触发对应的事件,就会执行不同的case。电脑与SIM800C之间的串口通信的流程图如下图所示:

在发送完成后,会触发EAT_EVENT_UART_SEND_COMPLETE和EAT_EVENT_UART_READY_WR两个事件。

而在SIM800C与modem进行UART的通讯之会触发EAT_EVENT_MDM_READY_WR一个事件,如下图所示:

四. 使用注意事项

1)  对于消息发送,函数eat_send_msg_to_user 可以在app_main 及app_user1 app_user2 …app_user8之间使用。
2)  系统消息可以发送给子线程,遵循的原则是从哪个线程调用的API,则对应的消息就发送给哪个线程。
例如在user1中调用eat_uart_open(EAT_UART_1)打开串口1,则当串口1收到数据时,EAT_EVENT_UART_READY_RD(event.uart.uart=EAT_UART_1)消息会上报到user1中。
例如:在app_main中调用eat_timer_start(EAT_TIMER_1),在user1中调用eat_timer_start(EAT_TIMER_2),则当EAT_TIMER_1时间到后,EAT_EVENT_TIMER(event.timer.timer_id = EAT_TIMER_1)消息会发送到app_main,当EAT_TIMER_2时间到后,EAT_EVENT_TIMER(event.timer.timer_id=EAT_TIMER_2)消息会发送到user1中。
例如:在user1中调用eat_modem_write(“AT\r\n”,4)发送AT指令到Core,则AT指令执行结果通过消息EAT_EVENT_MDM_READY_RD上报到user1。此后AT的URC上报也会发送到user1,直到其他线程,例如user2发送AT指令,此后AT执行结果及URC消息会发送到user2。
开机过程中的AT URC消息(EAT_EVENT_MDM_READY_RD)默认上报到main线程,可以通过eat_modem_set_poweron_urc_dir( )设置开机URC发送到指定线程。
3) eat_get_event或者eat_get_event_for_user 是同步接口,当调用该接口时,如果该线程有EVENT,则立即返回,如果没有,则线程会挂起。
如果不需要线程挂起,则可以先用eat_get_event_num()或者eat_get_event_num_for_user(EAT_USER_x)获取当前线程事件队列中事件个数,如果为0,则不调用eat_get_event(_for_user)接口,大于0再调用该接口。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值