总得来看,软件至少分成三个部分,一是3861上运行的LiteOS系统API,这里因为不像Camera侧的LiteOS那样兼容POSIX,所以一些比较重要的接口要先搞懂,比如消息队列和事件,还有flash和nv操作。二是组件,组件是在系统API上又封装的一层通用接口,比如状态机,事件路由,参数等模块,这些组件在应用里大量用到。最后是业务,比如待机唤醒,保活,低功耗等。
关键原因是3861上运行的LiteOS系统API和Camera侧的LiteOS系统API不太一样,Camera侧的LiteOS因为兼容POSIX,所以在开发程序时基本不需要学习新的API,只需要把在Linux上开发的那套东西拿过来直接用就可以了,比如线程,互斥锁,信号量等接口都是直接和Linux一样的。但在3861上运行的LiteOS系统的API不兼容POSIX,所以需要单独学习,这里只介绍几类常用的API,如下:
组件是在系统API上又封装的一层代码,用于实现一些公共的功能,比如状态机,事件路由等,这些组件对于提升代码复用,降低代码复杂度,提升开发速度有用,在业务代码中大量应用了组件的接口,所以也需要学习。几个组件如下:
在了解了3861的系统API和组件代码后,就可以开始分析3861主程序的业务代码了,主程序入口:3861L/wifi/reference/battery_ipcam/modules/init/src/hi_product_init_main.c,app_main()函数。
HI_VOID app_main(HI_VOID)
{
...
HI_PDT_INIT_PERIPHERAL_Init();
/* start key check thread as soon as possible */
HI_PDT_INIT_SERVICE_PreInit();
/* start system */
PDT_INIT_Init();
return;
}
"HI_PDT_INIT_PERIPHERAL_Init"
外设初始化。
"HI_PDT_INIT_SERVICE_PreInit"
服务预初始化。
"PDT_INIT_Init"
系统初始化。
软件开发大量参考文档:消费类 IP Camera Sample开发指南(Hi3861L).pdf
注意点:
设备的复位信号没接到3861上,这点与STM8方案不一样,STM8方案复位信号同时接主控和单片机,可以通过单片机强制复位。这点导致3861版的移康门铃无法实现开机上报复位键唤醒。
3861的2、6、8管脚在上电启动时不能输入高电平,否则会出异常,实测芯片根据启动不起来,上面的SPI_FS,也就是433的FCSB管脚接到了6脚上,而这个信号恰好是低有效,也就是平常是高电平状态,这就导致了按上面的电路上电,3861根本启动不起来,解决办法是临时增加一个拨位开关,在上电时断开SPI_FS,启动之后再连通SPI_FS和6脚。
上面的问题涉及到电路改版,目前的改动办法是,把SET_KEY,也就是门铃按键,和SPI_FS对调一下,同时修改门铃按键的电路,使其按下时为高,不按时为低就可以了。
#todo#