这个创意项目需要定期下达命令,轮询传感器节点,所以使用这个记录aos_timer的过程。
1.介绍系统定时器
AOS基于系统节拍的定时器tick作为最基本的时间调度单元,即最小时间周期。YoC该平台提供该基本软件定时器功能。CDK相关功能位于项目中aospack,其中的README.md列举的API如下所示。有关这些API进一步说明,可查看链接:https://yoc.docs.t-head.cn/yocbook/Chapter3-AliOS/操作系统接口/定时器.html。
图3-1定时器接口说明
分析API定时器功能需要定义aos_timer_t结构体变量,并将其指针传递到函数。结构体相关类型定义为../PACK/aos/v7.4.3/include/aos/kernel.h事实上,这是一种重定义的类型,本质上是一种空指针类型。
typedefstruct{ void*hdl; }aos_hdl_t; typedefaos_hdl_taos_task_t; typedefaos_hdl_taos_mutex_t; typedefaos_hdl_taos_sem_t; typedefaos_hdl_taos_queue_t; typedefaos_hdl_taos_timer_t; typedefaos_hdl_taos_work_t; typedefaos_hdl_taos_event_t;
在跟踪代码时,发现定时器api在系统内核中定义HelloWorld”案例中AOS是基于rhino内核,定时器实现的相关代码位于../PACK/aos/v7.4.3/src/adapter/rhino/aos_rhino.c”中。
图3-2定时器代码位置
事实上,创建定时器的函数有两个aos_timer_new()”和“aos_timer_new_ext()后者多传递一个参数-auto_run,即定时器是否自动启动。
图3-3创建定时器函数文档截图
2.使用定时器
我的创意项目需要定期收集,周期是上次配置的项目参数period,本来单位是分钟,为了快速看到调试效果,暂时用秒作为单位。
定时器溢出回调是pollingTimerCb()通过日志输出调试发现第二个参数有两个参数。arg2是创建定时器时设置的回调传参。第一个参数是定时器结构变量中的hdl会员地址——hdl指向真实的定时器数据结构。
voidpollingTimerCb(void*arg1,void*arg2){ char*s1=(char*)arg1; char*s2=(char*)arg2; LOGI(TAG,"pollingtimercallback!arg1:%s,arg2:%s\n",s1,s2); if(arg1==polling_timer.hdl) LOGI(TAG,"arg1istimer'saddress\n"); } voidaita_InitTimer(void){ intret=-1; LOGI(TAG,"initializetimerforpollingjob!\n"); ret=aos_timer_new_ext(&polling_timer,pollingTimerCb,"args",period*1000,1,0); if(ret!=0){ LOGE(TAG,"polling_timercreatefailed\n"); } LOGI(TAG,"pollingtimerstart\n"); aos_timer_start(&polling_timer); } voidboard_yoc_init() { board_init(); console_init(CONSOLE_UART_IDX,115200,128); ulog_init(); aos_set_log_level(AOS_LL_DEBUG); LOGI(TAG,"Build:%s,%s\n",__DATE__,__TIME__); /*loadpartition&initkvfunction*/ aita_InitKV(); /*setcycletimerforpollingjob*/ aita_InitTimer(); board_cli_init(); }
图3-4定时器功能测试
平头哥芯片开放社区
欢迎关注公众号:,查看更多应用实战文章。