OpenHarmony中AT模塊的代碼理解之一
??想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):??
??51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)??
1、背景
最早接觸AT命令是在使用通信模塊的時(shí)候,那時(shí)的AT命令的打包和解析都是自己寫(xiě)的函數(shù)實(shí)現(xiàn),代碼邏輯和框架也都不成熟,通用性也不強(qiáng)?,F(xiàn)在的RTOS操作系統(tǒng)中也都包含了這部分的內(nèi)容,比如RTT等,通用性更強(qiáng),代碼的邏輯性也值得我們?nèi)シ治龊蛯W(xué)習(xí)。接觸openharmony,發(fā)現(xiàn)系統(tǒng)代碼中也包含了AT相關(guān)的業(yè)務(wù)。今天,嘗試整理一下這部分代碼的思路。
2、提要
(1)代碼路徑
device\hisilicon\hispark_pegasus\sdk_liteos\components\at\src\
(2)關(guān)閉AT服務(wù)
有時(shí)候自己需要使用串口做一些私有業(yè)務(wù),不想使用原生的AT命令,比如,移植micropython,就需要關(guān)閉AT服務(wù)。關(guān)閉的方法如下:
打開(kāi)device\hisilicon\hispark_pegasus\sdk_liteos\build\config\usr_config.mk。
將其中的#CONFIG_AT_SUPPORT=y刪除?;蛘呤褂胢enuconfig操作該文件關(guān)閉。
關(guān)閉宏之后,config.mk中,會(huì)判斷該宏的值。
ifeq ($(CONFIG_AT_SUPPORT), y)
DEFINES += -DCONFIG_AT_COMMAND
endif
會(huì)使得AT的初始化,注冊(cè)相關(guān)函數(shù)無(wú)效。
3、框架
簡(jiǎn)單的描述一下程序框架,核心內(nèi)容分為接收任務(wù)和處理任務(wù),兩個(gè)任務(wù)之間通過(guò)Event事件同步。cmd_register函數(shù)用來(lái)注冊(cè)我們需要解析的AT命令。
4、代碼
(1) 數(shù)據(jù)的接收
在hi_u32 hi_at_init(hi_void)中創(chuàng)建了數(shù)據(jù)接收的任務(wù)。
attr.stack_size = g_at_uart_task_size;
attr.task_prio = AT_UART_TASK_PRIO;
attr.task_name = (hi_char*)"at_uart";
ret = hi_task_create(&at_uart_task, &attr, at_uart_task_body, 0);
if (ret != HI_ERR_SUCCESS) {
hi_at_printf("AT_UART_TSK init fail\r\n");
return ret;
}
(2) 數(shù)據(jù)的處理
attr.stack_size = 1024*6;
attr.task_prio = AT_PROC_TASK_PRIO;
attr.task_name = (hi_char*)"at_proc";
ret = hi_task_create(&at_proc_task, &attr, at_proc_task_body, 0);
if (ret != HI_ERR_SUCCESS) {
hi_at_printf("AT_PROC_TSK init fail\r\n");
return ret;
}
兩個(gè)任務(wù)之間通過(guò)g_at_event傳遞數(shù)據(jù)。buf = at_get_buf();獲取數(shù)據(jù)之后,進(jìn)行解析和處理。處理函數(shù)如下。
hi_void at_cmd_execute(hi_char *buf)
{
hi_u32 ret;
if (memcmp(buf, AT_CMD_HEADER, strlen(AT_CMD_HEADER)) == EOK) {
hi_char *at_buf = buf + strlen(AT_CMD_HEADER);
ret = at_cmd_process(at_buf);
if ((ret != HI_ERR_SUCCESS) && (ret != HI_ERR_RECVING)) {
g_at_ctrl.at_state = AT_IDLE;
}
} else {
AT_ENTER;
AT_RESPONSE_ERROR;
g_at_ctrl.at_state = AT_IDLE;
}
}
處理函數(shù)會(huì)從注冊(cè)的AT命令中對(duì)比關(guān)鍵詞,然后解析,處理,執(zhí)行。
5、總結(jié)
這篇文章先整理到這里,后續(xù)會(huì)有更詳細(xì)的對(duì)AT命令邏輯的分析。
后續(xù)的計(jì)劃:
(1)繼續(xù)分析openharmony的AT命令的代碼思路和關(guān)鍵函數(shù)的使用。
(2)對(duì)比RT-Thread等其他RTOS的AT部分實(shí)現(xiàn)。
(3)精簡(jiǎn)openharmony部分代碼,移植出一套可以在其他平臺(tái)使用的AT框架。
??想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):??
??51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)??