at_perf:modify the global lock to protect at agent

This commit is contained in:
mculover666
2022-06-28 15:45:23 +08:00
parent c18f082949
commit 87fd8e839d
6 changed files with 146 additions and 134 deletions

View File

@@ -1,3 +1,7 @@
## [2.5.2] - 2022-06-28
### Changed
- modify the global lock to protect the at agent.
## [2.5.1] - 2022-06-02 ## [2.5.1] - 2022-06-02
### Added ### Added
- add dynamic create and destroy api for task, sem, mutex, event, timer and corresponding unit test case. - add dynamic create and destroy api for task, sem, mutex, event, timer and corresponding unit test case.

View File

@@ -42,7 +42,7 @@ static int ec600s_check_ready(void)
{ {
at_echo_t echo; at_echo_t echo;
int try = 0; int try = 0;
while (try++ < 10) { while (try++ < 10) {
tos_at_echo_create(&echo, NULL, 0, NULL); tos_at_echo_create(&echo, NULL, 0, NULL);
tos_at_cmd_exec(AT_AGENT, &echo, 1000, "AT\r\n"); tos_at_cmd_exec(AT_AGENT, &echo, 1000, "AT\r\n");
@@ -60,7 +60,7 @@ static int ec600s_echo_close(void)
int try = 0; int try = 0;
tos_at_echo_create(&echo, NULL, 0, NULL); tos_at_echo_create(&echo, NULL, 0, NULL);
while (try++ < 10) { while (try++ < 10) {
tos_at_cmd_exec(AT_AGENT, &echo, 1000, "ATE0\r\n"); tos_at_cmd_exec(AT_AGENT, &echo, 1000, "ATE0\r\n");
if (echo.status == AT_ECHO_STATUS_OK) { if (echo.status == AT_ECHO_STATUS_OK) {
@@ -75,7 +75,7 @@ static int ec600s_sim_card_check(void)
at_echo_t echo; at_echo_t echo;
int try = 0; int try = 0;
char echo_buffer[32]; char echo_buffer[32];
tos_at_echo_create(&echo, echo_buffer, sizeof(echo_buffer), NULL); tos_at_echo_create(&echo, echo_buffer, sizeof(echo_buffer), NULL);
while (try++ < 10) { while (try++ < 10) {
tos_at_cmd_exec(AT_AGENT, &echo, 1000, "AT+CPIN?\r\n"); tos_at_cmd_exec(AT_AGENT, &echo, 1000, "AT+CPIN?\r\n");
@@ -84,7 +84,7 @@ static int ec600s_sim_card_check(void)
} }
tos_sleep_ms(2000); tos_sleep_ms(2000);
} }
return -1; return -1;
} }
@@ -94,7 +94,7 @@ static int ec600s_signal_quality_check(void)
at_echo_t echo; at_echo_t echo;
char echo_buffer[32], *str; char echo_buffer[32], *str;
int try = 0; int try = 0;
tos_at_echo_create(&echo, echo_buffer, sizeof(echo_buffer), NULL); tos_at_echo_create(&echo, echo_buffer, sizeof(echo_buffer), NULL);
while (try++ < 10) { while (try++ < 10) {
tos_at_cmd_exec(AT_AGENT, &echo, 1000, "AT+CSQ\r\n"); tos_at_cmd_exec(AT_AGENT, &echo, 1000, "AT+CSQ\r\n");
@@ -106,7 +106,7 @@ static int ec600s_signal_quality_check(void)
if (!str) { if (!str) {
return -1; return -1;
} }
sscanf(str, "+CSQ:%d,%d", &rssi, &ber); sscanf(str, "+CSQ:%d,%d", &rssi, &ber);
if (rssi != 99) { if (rssi != 99) {
return 0; return 0;
@@ -122,7 +122,7 @@ static int ec600s_gsm_network_check(void)
at_echo_t echo; at_echo_t echo;
char echo_buffer[32], *str; char echo_buffer[32], *str;
int try = 0; int try = 0;
tos_at_echo_create(&echo, echo_buffer, sizeof(echo_buffer), NULL); tos_at_echo_create(&echo, echo_buffer, sizeof(echo_buffer), NULL);
while (try++ < 10) { while (try++ < 10) {
tos_at_cmd_exec(AT_AGENT, &echo, 1000, "AT+CREG?\r\n"); tos_at_cmd_exec(AT_AGENT, &echo, 1000, "AT+CREG?\r\n");
@@ -140,8 +140,8 @@ static int ec600s_gsm_network_check(void)
} }
tos_sleep_ms(2000); tos_sleep_ms(2000);
} }
return -1; return -1;
} }
static int ec600s_gprs_network_check(void) static int ec600s_gprs_network_check(void)
@@ -168,7 +168,7 @@ static int ec600s_gprs_network_check(void)
} }
tos_sleep_ms(2000); tos_sleep_ms(2000);
} }
return -1; return -1;
} }
@@ -181,7 +181,7 @@ static int ec600s_close_apn(void)
if (echo.status == AT_ECHO_STATUS_OK) { if (echo.status == AT_ECHO_STATUS_OK) {
return 0; return 0;
} }
return -1; return -1;
} }
@@ -206,17 +206,17 @@ static int ec600s_set_apn(void)
static int ec600s_init(void) static int ec600s_init(void)
{ {
printf("Init ec600s ...\n" ); printf("Init ec600s ...\n" );
if (ec600s_check_ready() != 0) { if (ec600s_check_ready() != 0) {
printf("wait module ready timeout, please check your module\n"); printf("wait module ready timeout, please check your module\n");
return -1; return -1;
} }
if (ec600s_echo_close() != 0) { if (ec600s_echo_close() != 0) {
printf("echo close failed,please check your module\n"); printf("echo close failed,please check your module\n");
return -1; return -1;
} }
if(ec600s_sim_card_check() != 0) { if(ec600s_sim_card_check() != 0) {
printf("sim card check failed,please insert your card\n"); printf("sim card check failed,please insert your card\n");
return -1; return -1;
@@ -226,22 +226,22 @@ static int ec600s_init(void)
printf("signal quality check status failed\n"); printf("signal quality check status failed\n");
return -1; return -1;
} }
if(ec600s_gsm_network_check() != 0) { if(ec600s_gsm_network_check() != 0) {
printf("GSM network register status check fail\n"); printf("GSM network register status check fail\n");
return -1; return -1;
} }
if(ec600s_gprs_network_check() != 0) { if(ec600s_gprs_network_check() != 0) {
printf("GPRS network register status check fail\n"); printf("GPRS network register status check fail\n");
return -1; return -1;
} }
if(ec600s_close_apn() != 0) { if(ec600s_close_apn() != 0) {
printf("close apn failed\n"); printf("close apn failed\n");
return -1; return -1;
} }
if (ec600s_set_apn() != 0) { if (ec600s_set_apn() != 0) {
printf("apn set FAILED\n"); printf("apn set FAILED\n");
return -1; return -1;
@@ -259,14 +259,14 @@ static int ec600s_connect_establish(int id, sal_proto_t proto)
char *query_result_str = NULL; char *query_result_str = NULL;
char *remote_ip = NULL; char *remote_ip = NULL;
char *remote_port = NULL; char *remote_port = NULL;
tos_at_echo_create(&echo, echo_buffer, sizeof(echo_buffer), NULL); tos_at_echo_create(&echo, echo_buffer, sizeof(echo_buffer), NULL);
tos_at_cmd_exec(AT_AGENT, &echo, 1000, "AT+QISTATE=1,%d\r\n", id); tos_at_cmd_exec(AT_AGENT, &echo, 1000, "AT+QISTATE=1,%d\r\n", id);
if (echo.status != AT_ECHO_STATUS_OK) { if (echo.status != AT_ECHO_STATUS_OK) {
printf("query socket %d state fail\r\n", id); printf("query socket %d state fail\r\n", id);
return -1; return -1;
} }
sprintf(except_str, "+QISTATE: %d", id); sprintf(except_str, "+QISTATE: %d", id);
query_result_str = strstr(echo_buffer, except_str); query_result_str = strstr(echo_buffer, except_str);
if (query_result_str) { if (query_result_str) {
@@ -277,13 +277,13 @@ static int ec600s_connect_establish(int id, sal_proto_t proto)
memset(except_str, 0, sizeof(except_str)); memset(except_str, 0, sizeof(except_str));
sprintf(except_str, "+QIOPEN: %d,0", id); sprintf(except_str, "+QIOPEN: %d,0", id);
remote_ip = (char*)tos_at_channel_ip_get(AT_AGENT, id); remote_ip = (char*)tos_at_channel_ip_get(AT_AGENT, id);
remote_port = (char*)tos_at_channel_port_get(AT_AGENT, id); remote_port = (char*)tos_at_channel_port_get(AT_AGENT, id);
if (!remote_ip || !remote_port) { if (!remote_ip || !remote_port) {
return -2; return -2;
} }
tos_at_echo_create(&echo, NULL, 0, except_str); tos_at_echo_create(&echo, NULL, 0, except_str);
tos_at_cmd_exec_until(AT_AGENT, &echo, 4000, "AT+QIOPEN=1,%d,\"%s\",\"%s\",%d,0,1\r\n", tos_at_cmd_exec_until(AT_AGENT, &echo, 4000, "AT+QIOPEN=1,%d,\"%s\",\"%s\",%d,0,1\r\n",
id, proto == TOS_SAL_PROTO_UDP ? "UDP" : "TCP", remote_ip, atoi(remote_port)); id, proto == TOS_SAL_PROTO_UDP ? "UDP" : "TCP", remote_ip, atoi(remote_port));
@@ -291,32 +291,32 @@ static int ec600s_connect_establish(int id, sal_proto_t proto)
printf("establish socket %d on module fail\r\n", id); printf("establish socket %d on module fail\r\n", id);
return -3; return -3;
} }
return 0; return 0;
} }
static int ec600s_connect(const char *ip, const char *port, sal_proto_t proto) static int ec600s_connect(const char *ip, const char *port, sal_proto_t proto)
{ {
int id; int id;
id = tos_at_channel_alloc(AT_AGENT, ip, port); id = tos_at_channel_alloc(AT_AGENT, ip, port);
if (id == -1) { if (id == -1) {
printf("at channel alloc fail\r\n"); printf("at channel alloc fail\r\n");
return -1; return -1;
} }
if (ec600s_connect_establish(id, proto) < 0) { if (ec600s_connect_establish(id, proto) < 0) {
tos_at_channel_free(AT_AGENT, id); tos_at_channel_free(AT_AGENT, id);
return -2; return -2;
} }
return id; return id;
} }
static int ec600s_connect_with_size(const char *ip, const char *port, sal_proto_t proto, size_t socket_buffer_size) static int ec600s_connect_with_size(const char *ip, const char *port, sal_proto_t proto, size_t socket_buffer_size)
{ {
int id; int id;
id = tos_at_channel_alloc_with_size(AT_AGENT, ip, port, socket_buffer_size); id = tos_at_channel_alloc_with_size(AT_AGENT, ip, port, socket_buffer_size);
if (id == -1) { if (id == -1) {
printf("at channel alloc fail\r\n"); printf("at channel alloc fail\r\n");
@@ -327,7 +327,7 @@ static int ec600s_connect_with_size(const char *ip, const char *port, sal_proto_
tos_at_channel_free(AT_AGENT, id); tos_at_channel_free(AT_AGENT, id);
return -2; return -2;
} }
return id; return id;
} }
@@ -348,29 +348,21 @@ int ec600s_send(int id, const void *buf, size_t len)
if (!tos_at_channel_is_working(AT_AGENT, id)) { if (!tos_at_channel_is_working(AT_AGENT, id)) {
return -1; return -1;
} }
if (tos_at_global_lock_pend(AT_AGENT) != 0) {
return -1;
}
tos_at_echo_create(&echo, NULL, 0, ">"); tos_at_echo_create(&echo, NULL, 0, ">");
tos_at_cmd_exec_until(AT_AGENT, &echo, 1000, "AT+QISEND=%d,%d\r\n", id, len); tos_at_cmd_exec_until(AT_AGENT, &echo, 1000, "AT+QISEND=%d,%d\r\n", id, len);
if (echo.status != AT_ECHO_STATUS_EXPECT) { if (echo.status != AT_ECHO_STATUS_EXPECT) {
tos_at_global_lock_post(AT_AGENT);
return -1; return -1;
} }
tos_at_echo_create(&echo, NULL, 0, "SEND OK"); tos_at_echo_create(&echo, NULL, 0, "SEND OK");
tos_at_raw_data_send_until(AT_AGENT, &echo, 10000, (uint8_t *)buf, len); tos_at_raw_data_send_until(AT_AGENT, &echo, 10000, (uint8_t *)buf, len);
if (echo.status != AT_ECHO_STATUS_EXPECT) { if (echo.status != AT_ECHO_STATUS_EXPECT) {
tos_at_global_lock_post(AT_AGENT);
return -1; return -1;
} }
tos_at_global_lock_post(AT_AGENT);
return len; return len;
} }
@@ -388,34 +380,26 @@ int ec600s_sendto(int id, char *ip, char *port, const void *buf, size_t len)
{ {
at_echo_t echo; at_echo_t echo;
if (tos_at_global_lock_pend(AT_AGENT) != 0) {
return -1;
}
tos_at_echo_create(&echo, NULL, 0, ">"); tos_at_echo_create(&echo, NULL, 0, ">");
tos_at_cmd_exec_until(AT_AGENT, &echo, 1000, "AT+QISEND=%d,%d\r\n", id, len); tos_at_cmd_exec_until(AT_AGENT, &echo, 1000, "AT+QISEND=%d,%d\r\n", id, len);
if (echo.status != AT_ECHO_STATUS_EXPECT) { if (echo.status != AT_ECHO_STATUS_EXPECT) {
tos_at_global_lock_post(AT_AGENT);
return -1; return -1;
} }
tos_at_echo_create(&echo, NULL, 0, "SEND OK"); tos_at_echo_create(&echo, NULL, 0, "SEND OK");
tos_at_raw_data_send(AT_AGENT, &echo, 1000, (uint8_t *)buf, len); tos_at_raw_data_send(AT_AGENT, &echo, 1000, (uint8_t *)buf, len);
if (echo.status != AT_ECHO_STATUS_EXPECT) { if (echo.status != AT_ECHO_STATUS_EXPECT) {
tos_at_global_lock_post(AT_AGENT);
return -1; return -1;
} }
tos_at_global_lock_post(AT_AGENT);
return len; return len;
} }
static void ec600s_transparent_mode_exit(void) static void ec600s_transparent_mode_exit(void)
{ {
at_echo_t echo; at_echo_t echo;
tos_at_echo_create(&echo, NULL, 0, NULL); tos_at_echo_create(&echo, NULL, 0, NULL);
tos_at_cmd_exec(AT_AGENT, &echo, 500, "+++"); tos_at_cmd_exec(AT_AGENT, &echo, 500, "+++");
} }
@@ -423,7 +407,7 @@ static void ec600s_transparent_mode_exit(void)
static int ec600s_close(int id) static int ec600s_close(int id)
{ {
at_echo_t echo; at_echo_t echo;
ec600s_transparent_mode_exit(); ec600s_transparent_mode_exit();
tos_at_echo_create(&echo, NULL, 0, NULL); tos_at_echo_create(&echo, NULL, 0, NULL);
@@ -467,7 +451,7 @@ __STATIC__ void ec600s_incoming_data_process(void)
+QIURC: "recv",<sockid>,<datalen> +QIURC: "recv",<sockid>,<datalen>
<data content> <data content>
*/ */
while (1) { while (1) {
if (tos_at_uart_read(AT_AGENT, &data, 1) != 1) { if (tos_at_uart_read(AT_AGENT, &data, 1) != 1) {
return; return;
@@ -492,7 +476,7 @@ __STATIC__ void ec600s_incoming_data_process(void)
if (tos_at_uart_read(AT_AGENT, &data, 1) != 1) { if (tos_at_uart_read(AT_AGENT, &data, 1) != 1) {
return; return;
} }
do { do {
#if !defined(MIN) #if !defined(MIN)
#define MIN(a, b) ((a) < (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b))
@@ -529,7 +513,7 @@ __STATIC__ void ec600s_domain_data_process(void)
if (data == '0') { if (data == '0') {
return; return;
} }
if (data == '\"') { if (data == '\"') {
/* start parser domain */ /* start parser domain */
while (1) { while (1) {
@@ -595,7 +579,7 @@ sal_module_t sal_module_ec600s = {
int ec600s_sal_init(hal_uart_port_t uart_port) int ec600s_sal_init(hal_uart_port_t uart_port)
{ {
if (tos_at_init(AT_AGENT, "ec600s_at", ec600s_at_parse_task_stk, if (tos_at_init(AT_AGENT, "ec600s_at", ec600s_at_parse_task_stk,
uart_port, ec600s_at_event, uart_port, ec600s_at_event,
sizeof(ec600s_at_event) / sizeof(ec600s_at_event[0])) != 0) { sizeof(ec600s_at_event) / sizeof(ec600s_at_event[0])) != 0) {
@@ -608,7 +592,7 @@ int ec600s_sal_init(hal_uart_port_t uart_port)
if (tos_sal_module_init() != 0) { if (tos_sal_module_init() != 0) {
return -1; return -1;
} }
return 0; return 0;
} }
@@ -623,7 +607,7 @@ int ec600s_sal_deinit()
tos_sal_module_register_default(); tos_sal_module_register_default();
tos_at_deinit(AT_AGENT); tos_at_deinit(AT_AGENT);
return 0; return 0;
} }

View File

@@ -105,12 +105,15 @@ int esp8266_join_ap(const char *ssid, const char *pwd)
{ {
int try = 0; int try = 0;
at_echo_t echo; at_echo_t echo;
char echo_buffer[128];
tos_at_echo_create(&echo, NULL, 0, NULL); tos_at_echo_create(&echo, echo_buffer, sizeof(echo_buffer), NULL);
while (try++ < 10) { while (try++ < 10) {
tos_at_cmd_exec(AT_AGENT, &echo, 15000, "AT+CWJAP=\"%s\",\"%s\"\r\n", ssid, pwd); tos_at_cmd_exec(AT_AGENT, &echo, 20000, "AT+CWJAP=\"%s\",\"%s\"\r\n", ssid, pwd);
if (echo.status == AT_ECHO_STATUS_OK) { if (echo.status == AT_ECHO_STATUS_OK) {
return 0; if (strstr(echo_buffer, "WIFI GOT IP")) {
return 0;
}
} }
} }
return -1; return -1;
@@ -200,10 +203,6 @@ static int esp8266_send(int id, const void *buf, size_t len)
return -1; return -1;
} }
if (tos_at_global_lock_pend(AT_AGENT) != 0) {
return -1;
}
tos_at_echo_create(&echo, echo_buffer, sizeof(echo_buffer), ">"); tos_at_echo_create(&echo, echo_buffer, sizeof(echo_buffer), ">");
#if TOS_CFG_MODULE_SINGLE_LINK_EN > 0u #if TOS_CFG_MODULE_SINGLE_LINK_EN > 0u
tos_at_cmd_exec_until(&echo, 5000, tos_at_cmd_exec_until(&echo, 5000,
@@ -218,7 +217,6 @@ static int esp8266_send(int id, const void *buf, size_t len)
tos_at_channel_set_broken(AT_AGENT, id); tos_at_channel_set_broken(AT_AGENT, id);
} }
tos_at_global_lock_post(AT_AGENT);
return -1; return -1;
} }
@@ -234,11 +232,9 @@ static int esp8266_send(int id, const void *buf, size_t len)
tos_at_channel_set_broken(AT_AGENT, id); tos_at_channel_set_broken(AT_AGENT, id);
} }
tos_at_global_lock_post(AT_AGENT);
return -1; return -1;
} }
tos_at_global_lock_post(AT_AGENT);
return len; return len;
} }
@@ -251,10 +247,6 @@ static int esp8266_sendto(int id, char *ip, char *port, const void *buf, size_t
return -1; return -1;
} }
if (tos_at_global_lock_pend(AT_AGENT) != 0) {
return -1;
}
tos_at_echo_create(&echo, echo_buffer, sizeof(echo_buffer), ">"); tos_at_echo_create(&echo, echo_buffer, sizeof(echo_buffer), ">");
if (ip && port) { if (ip && port) {
@@ -280,7 +272,6 @@ static int esp8266_sendto(int id, char *ip, char *port, const void *buf, size_t
tos_at_channel_set_broken(AT_AGENT, id); tos_at_channel_set_broken(AT_AGENT, id);
} }
tos_at_global_lock_post(AT_AGENT);
return -1; return -1;
} }
@@ -296,11 +287,9 @@ static int esp8266_sendto(int id, char *ip, char *port, const void *buf, size_t
tos_at_channel_set_broken(AT_AGENT, id); tos_at_channel_set_broken(AT_AGENT, id);
} }
tos_at_global_lock_post(AT_AGENT);
return -1; return -1;
} }
tos_at_global_lock_post(AT_AGENT);
return len; return len;
} }
@@ -317,9 +306,9 @@ static int esp8266_recvfrom(int id, void *buf, size_t len)
static int esp8266_close(int id) static int esp8266_close(int id)
{ {
at_echo_t echo; at_echo_t echo;
tos_at_echo_create(&echo, NULL, 0, NULL); tos_at_echo_create(&echo, NULL, 0, NULL);
#if TOS_CFG_MODULE_SINGLE_LINK_EN > 0u #if TOS_CFG_MODULE_SINGLE_LINK_EN > 0u
tos_at_cmd_exec(AT_AGENT, &echo, 1000, "AT+CIPCLOSE\r\n"); tos_at_cmd_exec(AT_AGENT, &echo, 1000, "AT+CIPCLOSE\r\n");
#else #else
@@ -441,7 +430,7 @@ __STATIC__ void esp8266_incoming_data_process(void)
if (tos_at_uart_read(AT_AGENT, buffer, read_len) != read_len) { if (tos_at_uart_read(AT_AGENT, buffer, read_len) != read_len) {
return; return;
} }
//delay has two reason, wait for the data to be cached and untrigger scheduling //delay has two reason, wait for the data to be cached and untrigger scheduling
tos_stopwatch_delay(200); tos_stopwatch_delay(200);
@@ -501,7 +490,7 @@ int esp8266_sal_deinit()
tos_sal_module_register_default(); tos_sal_module_register_default();
tos_at_deinit(AT_AGENT); tos_at_deinit(AT_AGENT);
return 0; return 0;
} }

View File

@@ -25,8 +25,8 @@
#define TOS_VERSION_MAJOR 0x02 #define TOS_VERSION_MAJOR 0x02
#define TOS_VERSION_MINOR 0x05 #define TOS_VERSION_MINOR 0x05
#define TOS_VERSION_PATCH 0x01 #define TOS_VERSION_PATCH 0x02
#define TOS_VERSION "2.5.1" #define TOS_VERSION "2.5.2"
#endif /* _TOS_VERSION_H_ */ #endif /* _TOS_VERSION_H_ */

View File

@@ -140,22 +140,26 @@ typedef struct at_agent_st {
k_task_t parser; k_task_t parser;
at_cache_t recv_cache; at_cache_t recv_cache;
/* protected the AT agent, so only one AT instruction is executing any one time. */
k_mutex_t global_lock; k_mutex_t global_lock;
char *cmd_buf; char *cmd_buf;
k_mutex_t cmd_buf_lock;
/* global_lock has protected the at agent, so cmd buf lock is unnecessary,
the code will be removed in next version. */
// k_mutex_t cmd_buf_lock;
hal_uart_t uart; hal_uart_t uart;
k_mutex_t uart_tx_lock; k_mutex_t uart_tx_lock;
// k_mutex_t uart_rx_lock; // k_mutex_t uart_rx_lock;
#if AT_INPUT_TYPE_FRAME_EN #if AT_INPUT_TYPE_FRAME_EN
k_mail_q_t uart_rx_frame_mail; k_mail_q_t uart_rx_frame_mail;
uint8_t *uart_rx_frame_mail_buffer; uint8_t *uart_rx_frame_mail_buffer;
uint16_t fifo_available_len; uint16_t fifo_available_len;
#else #else
k_sem_t uart_rx_sem; k_sem_t uart_rx_sem;
#if AT_INPUT_SIMULATE_IDLE_EN #if AT_INPUT_SIMULATE_IDLE_EN
k_timer_t idle_check_timer; k_timer_t idle_check_timer;
#endif /* AT_INPUT_SIMULATE_IDLE_EN */ #endif /* AT_INPUT_SIMULATE_IDLE_EN */
@@ -329,7 +333,7 @@ __API__ int tos_at_init(at_agent_t *at_agent, char *task_name, k_stack_t *stk, h
* @brief De-initialize the at framework. * @brief De-initialize the at framework.
* *
* @param[in] at_agent pointer to the at agent struct. * @param[in] at_agent pointer to the at agent struct.
* *
* @attention None * @attention None
* *
* @return * @return

View File

@@ -14,7 +14,7 @@
* as the other licenses applicable to the third-party components included * as the other licenses applicable to the third-party components included
* within TencentOS. * within TencentOS.
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
/* /*
Note: Note:
If you find that the AT framework occasionally loses characters, If you find that the AT framework occasionally loses characters,
@@ -46,11 +46,11 @@ __STATIC__ int at_uart_getchar_from_fifo(at_agent_t *at_agent, uint8_t *data)
{ {
TOS_CPU_CPSR_ALLOC(); TOS_CPU_CPSR_ALLOC();
k_err_t err; k_err_t err;
TOS_CPU_INT_DISABLE(); TOS_CPU_INT_DISABLE();
err = tos_chr_fifo_pop(&at_agent->uart_rx_fifo, data); err = tos_chr_fifo_pop(&at_agent->uart_rx_fifo, data);
TOS_CPU_INT_ENABLE(); TOS_CPU_INT_ENABLE();
return err; return err;
} }
@@ -79,30 +79,30 @@ __STATIC__ int at_uart_getchar(at_agent_t *at_agent, uint8_t *data, k_tick_t tim
return -1; return -1;
} }
} }
if (at_uart_getchar_from_fifo(at_agent, data) != K_ERR_NONE) { if (at_uart_getchar_from_fifo(at_agent, data) != K_ERR_NONE) {
return -1; return -1;
} }
return 0; return 0;
#else #else
tos_stopwatch_delay(1); tos_stopwatch_delay(1);
if (tos_sem_pend(&at_agent->uart_rx_sem, timeout) != K_ERR_NONE) { if (tos_sem_pend(&at_agent->uart_rx_sem, timeout) != K_ERR_NONE) {
return -1; return -1;
} }
/* /*
the uart_rx_fifo is only read by at_parser task, the uart_rx_fifo is only read by at_parser task,
and it will be written in usart interrupt handler, and it will be written in usart interrupt handler,
so it is more effective to use critical sections. so it is more effective to use critical sections.
*/ */
// if (tos_mutex_pend(&at_agent->uart_rx_lock) != K_ERR_NONE) { // if (tos_mutex_pend(&at_agent->uart_rx_lock) != K_ERR_NONE) {
// return -1; // return -1;
// } // }
if (at_uart_getchar_from_fifo(at_agent, data) != K_ERR_NONE) { if (at_uart_getchar_from_fifo(at_agent, data) != K_ERR_NONE) {
return -1; return -1;
} }
@@ -274,7 +274,7 @@ __STATIC__ at_parse_status_t at_uart_line_parse(at_agent_t *at_agent)
recv_cache->buffer[recv_cache->buffer_size - 1] = '\0'; recv_cache->buffer[recv_cache->buffer_size - 1] = '\0';
return AT_PARSE_STATUS_OVERFLOW; return AT_PARSE_STATUS_OVERFLOW;
} }
if (at_get_event(at_agent) != K_NULL) { if (at_get_event(at_agent) != K_NULL) {
return AT_PARSE_STATUS_EVENT; return AT_PARSE_STATUS_EVENT;
} }
@@ -282,9 +282,9 @@ __STATIC__ at_parse_status_t at_uart_line_parse(at_agent_t *at_agent)
if (at_is_echo_expect(at_agent)) { if (at_is_echo_expect(at_agent)) {
return AT_PARSE_STATUS_EXPECT; return AT_PARSE_STATUS_EXPECT;
} }
AT_LOG("recv_cache:[%s](%d)\r\n", recv_cache->buffer, recv_cache->recv_len); AT_LOG("recv_cache:[%s](%d)\r\n", recv_cache->buffer, recv_cache->recv_len);
if (strstr((char*)recv_cache->buffer, "OK")) { if (strstr((char*)recv_cache->buffer, "OK")) {
return AT_PARSE_STATUS_OK; return AT_PARSE_STATUS_OK;
} else if (strstr((char*)recv_cache->buffer, "FAIL")) { } else if (strstr((char*)recv_cache->buffer, "FAIL")) {
@@ -344,11 +344,11 @@ __STATIC__ void at_parser(void *arg)
recv_cache = &at_agent->recv_cache; recv_cache = &at_agent->recv_cache;
while (K_TRUE) { while (K_TRUE) {
at_parse_status = at_uart_line_parse(at_agent); at_parse_status = at_uart_line_parse(at_agent);
AT_LOG("at line parser end!(%d)\r\n", at_parse_status); AT_LOG("at line parser end!(%d)\r\n", at_parse_status);
tos_kprintln("--->%s", recv_cache->buffer); tos_kprintln("--->%s", recv_cache->buffer);
if (at_parse_status == AT_PARSE_STATUS_OVERFLOW) { if (at_parse_status == AT_PARSE_STATUS_OVERFLOW) {
@@ -368,7 +368,7 @@ __STATIC__ void at_parser(void *arg)
if (!at_echo) { if (!at_echo) {
continue; continue;
} }
if (at_echo->buffer) { if (at_echo->buffer) {
at_echo_buffer_copy(recv_cache, at_echo); at_echo_buffer_copy(recv_cache, at_echo);
} }
@@ -467,16 +467,24 @@ __API__ int tos_at_raw_data_send(at_agent_t *at_agent, at_echo_t *echo, uint32_t
{ {
int ret = 0; int ret = 0;
if (echo) { if (!echo) {
at_echo_attach(at_agent, echo); return -1;
} }
if (tos_at_global_lock_pend(at_agent) != 0) {
return -1;
}
at_echo_attach(at_agent, echo);
ret = at_uart_send(at_agent, buf, size, 0xFFFF); ret = at_uart_send(at_agent, buf, size, 0xFFFF);
tos_task_delay(tos_millisec2tick(timeout)); tos_task_delay(tos_millisec2tick(timeout));
at_agent->echo = K_NULL; at_agent->echo = K_NULL;
tos_at_global_lock_post(at_agent);
return ret; return ret;
} }
@@ -488,7 +496,12 @@ __API__ int tos_at_raw_data_send_until(at_agent_t *at_agent, at_echo_t *echo, ui
return -1; return -1;
} }
if (tos_at_global_lock_pend(at_agent) != 0) {
return -1;
}
if (tos_sem_create(&echo->__expect_notify, 0) != K_ERR_NONE) { if (tos_sem_create(&echo->__expect_notify, 0) != K_ERR_NONE) {
tos_at_global_lock_post(at_agent);
return -1; return -1;
} }
echo->__is_expecting = K_TRUE; echo->__is_expecting = K_TRUE;
@@ -504,6 +517,8 @@ __API__ int tos_at_raw_data_send_until(at_agent_t *at_agent, at_echo_t *echo, ui
at_agent->echo = K_NULL; at_agent->echo = K_NULL;
tos_at_global_lock_post(at_agent);
return ret; return ret;
} }
@@ -511,9 +526,9 @@ __STATIC__ int at_cmd_do_exec(at_agent_t *at_agent, const char *format, va_list
{ {
size_t cmd_len = 0; size_t cmd_len = 0;
if (tos_mutex_pend(&at_agent->cmd_buf_lock) != K_ERR_NONE) { // if (tos_mutex_pend(&at_agent->cmd_buf_lock) != K_ERR_NONE) {
return -1; // return -1;
} // }
cmd_len = vsnprintf(at_agent->cmd_buf, AT_CMD_BUFFER_SIZE, format, args); cmd_len = vsnprintf(at_agent->cmd_buf, AT_CMD_BUFFER_SIZE, format, args);
@@ -521,7 +536,7 @@ __STATIC__ int at_cmd_do_exec(at_agent_t *at_agent, const char *format, va_list
at_uart_send(at_agent, (uint8_t *)at_agent->cmd_buf, cmd_len, 0xFFFF); at_uart_send(at_agent, (uint8_t *)at_agent->cmd_buf, cmd_len, 0xFFFF);
tos_mutex_post(&at_agent->cmd_buf_lock); // tos_mutex_post(&at_agent->cmd_buf_lock);
return 0; return 0;
} }
@@ -530,23 +545,29 @@ __API__ int tos_at_cmd_exec(at_agent_t *at_agent, at_echo_t *echo, uint32_t time
{ {
int ret = 0; int ret = 0;
va_list args; va_list args;
if (!echo) { if (!echo) {
return -1; return -1;
} }
if (tos_at_global_lock_pend(at_agent) != 0) {
return -1;
}
if (tos_sem_create(&echo->__status_set_notify, 0) != K_ERR_NONE) { if (tos_sem_create(&echo->__status_set_notify, 0) != K_ERR_NONE) {
tos_at_global_lock_post(at_agent);
return -1; return -1;
} }
at_echo_attach(at_agent, echo); at_echo_attach(at_agent, echo);
va_start(args, cmd); va_start(args, cmd);
ret = at_cmd_do_exec(at_agent, cmd, args); ret = at_cmd_do_exec(at_agent, cmd, args);
va_end(args); va_end(args);
if (ret != 0) { if (ret != 0) {
at_agent->echo = K_NULL; at_agent->echo = K_NULL;
tos_at_global_lock_post(at_agent);
return -1; return -1;
} }
@@ -558,6 +579,8 @@ __API__ int tos_at_cmd_exec(at_agent_t *at_agent, at_echo_t *echo, uint32_t time
at_agent->echo = K_NULL; at_agent->echo = K_NULL;
tos_at_global_lock_post(at_agent);
return ret; return ret;
} }
@@ -570,7 +593,12 @@ __API__ int tos_at_cmd_exec_until(at_agent_t *at_agent, at_echo_t *echo, uint32_
return -1; return -1;
} }
if (tos_at_global_lock_pend(at_agent) != 0) {
return -1;
}
if (tos_sem_create(&echo->__expect_notify, 0) != K_ERR_NONE) { if (tos_sem_create(&echo->__expect_notify, 0) != K_ERR_NONE) {
tos_at_global_lock_post(at_agent);
return -1; return -1;
} }
echo->__is_expecting = K_TRUE; echo->__is_expecting = K_TRUE;
@@ -582,6 +610,7 @@ __API__ int tos_at_cmd_exec_until(at_agent_t *at_agent, at_echo_t *echo, uint32_
if (ret != 0) { if (ret != 0) {
at_agent->echo = K_NULL; at_agent->echo = K_NULL;
tos_at_global_lock_post(at_agent);
return -1; return -1;
} }
@@ -593,6 +622,8 @@ __API__ int tos_at_cmd_exec_until(at_agent_t *at_agent, at_echo_t *echo, uint32_
at_agent->echo = K_NULL; at_agent->echo = K_NULL;
tos_at_global_lock_post(at_agent);
return ret; return ret;
} }
@@ -696,7 +727,7 @@ __API__ int tos_at_channel_read_timed(at_agent_t *at_agent, int channel_id, uint
remain_tick = tos_millisec2tick(timeout); remain_tick = tos_millisec2tick(timeout);
tos_stopwatch_countdown(&data_channel->timer, remain_tick); tos_stopwatch_countdown(&data_channel->timer, remain_tick);
while (!tos_stopwatch_is_expired(&data_channel->timer)) { while (!tos_stopwatch_is_expired(&data_channel->timer)) {
remain_tick = tos_stopwatch_remain(&data_channel->timer); remain_tick = tos_stopwatch_remain(&data_channel->timer);
if (remain_tick == (k_tick_t)0u) { if (remain_tick == (k_tick_t)0u) {
@@ -710,7 +741,7 @@ __API__ int tos_at_channel_read_timed(at_agent_t *at_agent, int channel_id, uint
read_len = tos_chr_fifo_pop_stream(&data_channel->rx_fifo, buffer + total_read_len, buffer_len - total_read_len); read_len = tos_chr_fifo_pop_stream(&data_channel->rx_fifo, buffer + total_read_len, buffer_len - total_read_len);
tos_mutex_post(&data_channel->rx_lock); tos_mutex_post(&data_channel->rx_lock);
if (read_len == 0) { if (read_len == 0) {
remain_tick = tos_stopwatch_remain(&data_channel->timer); remain_tick = tos_stopwatch_remain(&data_channel->timer);
tos_sem_pend(&data_channel->rx_sem, remain_tick); tos_sem_pend(&data_channel->rx_sem, remain_tick);
@@ -752,13 +783,13 @@ __API__ int tos_at_channel_write(at_agent_t *at_agent, int channel_id, uint8_t *
__STATIC_INLINE__ int at_channel_construct(at_data_channel_t *data_channel, const char *ip, const char *port, size_t socket_buffer_size) __STATIC_INLINE__ int at_channel_construct(at_data_channel_t *data_channel, const char *ip, const char *port, size_t socket_buffer_size)
{ {
uint8_t *fifo_buffer = K_NULL; uint8_t *fifo_buffer = K_NULL;
fifo_buffer = tos_mmheap_alloc(socket_buffer_size); fifo_buffer = tos_mmheap_alloc(socket_buffer_size);
if (!fifo_buffer) { if (!fifo_buffer) {
return -1; return -1;
} }
if (tos_sem_create_max(&data_channel->rx_sem, 0, 1) != K_ERR_NONE) { if (tos_sem_create_max(&data_channel->rx_sem, 0, 1) != K_ERR_NONE) {
goto errout; goto errout;
} }
@@ -860,7 +891,7 @@ __API__ int tos_at_channel_free(at_agent_t *at_agent, int channel_id)
if (!data_channel) { if (!data_channel) {
return -1; return -1;
} }
tos_sem_destroy(&data_channel->rx_sem); tos_sem_destroy(&data_channel->rx_sem);
tos_mutex_destroy(&data_channel->rx_lock); tos_mutex_destroy(&data_channel->rx_lock);
@@ -957,7 +988,7 @@ __STATIC__ void tos_at_uart_input_notify(at_agent_t *at_agent)
} }
__STATIC__ void idle_check_timer_callback(void *args) __STATIC__ void idle_check_timer_callback(void *args)
{ {
at_agent_t *at_agent = (at_agent_t *)args; at_agent_t *at_agent = (at_agent_t *)args;
tos_at_uart_input_notify(at_agent); tos_at_uart_input_notify(at_agent);
} }
@@ -987,9 +1018,9 @@ __API__ int tos_at_init(at_agent_t *at_agent, char *task_name, k_stack_t *stk, h
} }
at_agent->cmd_buf = (char *)buffer; at_agent->cmd_buf = (char *)buffer;
if (tos_mutex_create(&at_agent->cmd_buf_lock) != K_ERR_NONE) { // if (tos_mutex_create(&at_agent->cmd_buf_lock) != K_ERR_NONE) {
goto errout1; // goto errout1;
} // }
if (at_recv_cache_init(at_agent) != 0) { if (at_recv_cache_init(at_agent) != 0) {
goto errout2; goto errout2;
@@ -1000,9 +1031,9 @@ __API__ int tos_at_init(at_agent_t *at_agent, char *task_name, k_stack_t *stk, h
if (!buffer) { if (!buffer) {
goto errout3; goto errout3;
} }
at_agent->uart_rx_frame_mail_buffer = (uint8_t *)buffer; at_agent->uart_rx_frame_mail_buffer = (uint8_t *)buffer;
if (tos_mail_q_create(&at_agent->uart_rx_frame_mail, buffer, AT_FRAME_LEN_MAIL_MAX, sizeof(at_frame_len_mail_t)) != K_ERR_NONE) { if (tos_mail_q_create(&at_agent->uart_rx_frame_mail, buffer, AT_FRAME_LEN_MAIL_MAX, sizeof(at_frame_len_mail_t)) != K_ERR_NONE) {
goto errout4; goto errout4;
} }
@@ -1019,22 +1050,22 @@ __API__ int tos_at_init(at_agent_t *at_agent, char *task_name, k_stack_t *stk, h
if (tos_mutex_create(&at_agent->uart_tx_lock) != K_ERR_NONE) { if (tos_mutex_create(&at_agent->uart_tx_lock) != K_ERR_NONE) {
goto errout6; goto errout6;
} }
if (tos_mutex_create(&at_agent->global_lock) != K_ERR_NONE) { if (tos_mutex_create(&at_agent->global_lock) != K_ERR_NONE) {
goto errout7; goto errout7;
} }
#if AT_INPUT_SIMULATE_IDLE_EN #if AT_INPUT_SIMULATE_IDLE_EN
if (tos_timer_create(&at_agent->idle_check_timer, SIMULATE_IDLE_DEFAULT_TIME, if (tos_timer_create(&at_agent->idle_check_timer, SIMULATE_IDLE_DEFAULT_TIME,
0, idle_check_timer_callback, at_agent, TOS_OPT_TIMER_ONESHOT) != K_ERR_NONE) { 0, idle_check_timer_callback, at_agent, TOS_OPT_TIMER_ONESHOT) != K_ERR_NONE) {
goto errout8; goto errout8;
} }
#endif /* AT_INPUT_SIMULATE_IDLE_EN */ #endif /* AT_INPUT_SIMULATE_IDLE_EN */
if (tos_hal_uart_init(&at_agent->uart, uart_port) != 0) { if (tos_hal_uart_init(&at_agent->uart, uart_port) != 0) {
goto errout9; goto errout9;
} }
if (tos_task_create(&at_agent->parser, task_name, at_parser, if (tos_task_create(&at_agent->parser, task_name, at_parser,
at_agent, AT_PARSER_TASK_PRIO, stk, at_agent, AT_PARSER_TASK_PRIO, stk,
AT_PARSER_TASK_STACK_SIZE, 0) != K_ERR_NONE) { AT_PARSER_TASK_STACK_SIZE, 0) != K_ERR_NONE) {
@@ -1044,18 +1075,18 @@ __API__ int tos_at_init(at_agent_t *at_agent, char *task_name, k_stack_t *stk, h
return 0; return 0;
errout10: errout10:
tos_hal_uart_deinit(&at_agent->uart); tos_hal_uart_deinit(&at_agent->uart);
errout9: errout9:
#if AT_INPUT_SIMULATE_IDLE_EN #if AT_INPUT_SIMULATE_IDLE_EN
tos_timer_destroy(&at_agent->idle_check_timer); tos_timer_destroy(&at_agent->idle_check_timer);
errout8: errout8:
#endif /* AT_INPUT_SIMULATE_IDLE_EN */ #endif /* AT_INPUT_SIMULATE_IDLE_EN */
tos_mutex_destroy(&at_agent->global_lock); tos_mutex_destroy(&at_agent->global_lock);
errout7: errout7:
tos_mutex_destroy(&at_agent->uart_tx_lock); tos_mutex_destroy(&at_agent->uart_tx_lock);
errout6: errout6:
// tos_mutex_destroy(&at_agent->uart_rx_lock); // tos_mutex_destroy(&at_agent->uart_rx_lock);
@@ -1065,7 +1096,7 @@ errout6:
#else #else
tos_sem_destroy(&at_agent->uart_rx_sem); tos_sem_destroy(&at_agent->uart_rx_sem);
#endif /* AT_INPUT_TYPE_FRAME_EN */ #endif /* AT_INPUT_TYPE_FRAME_EN */
#if AT_INPUT_TYPE_FRAME_EN #if AT_INPUT_TYPE_FRAME_EN
errout4: errout4:
tos_mmheap_free(at_agent->uart_rx_frame_mail_buffer); tos_mmheap_free(at_agent->uart_rx_frame_mail_buffer);
@@ -1076,9 +1107,9 @@ errout3:
at_recv_cache_deinit(at_agent); at_recv_cache_deinit(at_agent);
errout2: errout2:
tos_mutex_destroy(&at_agent->cmd_buf_lock); // tos_mutex_destroy(&at_agent->cmd_buf_lock);
errout1: //errout1:
tos_mmheap_free(at_agent->cmd_buf); tos_mmheap_free(at_agent->cmd_buf);
at_agent->cmd_buf = K_NULL; at_agent->cmd_buf = K_NULL;
@@ -1093,15 +1124,15 @@ errout0:
__API__ void tos_at_deinit(at_agent_t *at_agent) __API__ void tos_at_deinit(at_agent_t *at_agent)
{ {
tos_task_destroy(&at_agent->parser); tos_task_destroy(&at_agent->parser);
tos_hal_uart_deinit(&at_agent->uart); tos_hal_uart_deinit(&at_agent->uart);
tos_mutex_destroy(&at_agent->global_lock); tos_mutex_destroy(&at_agent->global_lock);
tos_mutex_destroy(&at_agent->uart_tx_lock); tos_mutex_destroy(&at_agent->uart_tx_lock);
//tos_mutex_destroy(&at_agent->uart_tx_lock); //tos_mutex_destroy(&at_agent->uart_tx_lock);
#if AT_INPUT_SIMULATE_IDLE_EN #if AT_INPUT_SIMULATE_IDLE_EN
tos_timer_destroy(&at_agent->idle_check_timer); tos_timer_destroy(&at_agent->idle_check_timer);
#endif /* AT_INPUT_SIMULATE_IDLE_EN */ #endif /* AT_INPUT_SIMULATE_IDLE_EN */
@@ -1113,10 +1144,10 @@ __API__ void tos_at_deinit(at_agent_t *at_agent)
#else #else
tos_sem_destroy(&at_agent->uart_rx_sem); tos_sem_destroy(&at_agent->uart_rx_sem);
#endif /* AT_INPUT_TYPE_FRAME_EN */ #endif /* AT_INPUT_TYPE_FRAME_EN */
at_recv_cache_deinit(at_agent); at_recv_cache_deinit(at_agent);
tos_mutex_destroy(&at_agent->cmd_buf_lock); // tos_mutex_destroy(&at_agent->cmd_buf_lock);
tos_mmheap_free(at_agent->cmd_buf); tos_mmheap_free(at_agent->cmd_buf);
at_agent->cmd_buf = K_NULL; at_agent->cmd_buf = K_NULL;
@@ -1136,12 +1167,12 @@ __API__ void tos_at_uart_input_frame(at_agent_t *at_agent, uint8_t *pdata, uint1
{ {
int ret; int ret;
at_frame_len_mail_t at_frame_len_mail; at_frame_len_mail_t at_frame_len_mail;
ret = tos_chr_fifo_push_stream(&at_agent->uart_rx_fifo, pdata, len); ret = tos_chr_fifo_push_stream(&at_agent->uart_rx_fifo, pdata, len);
if (ret != len) { if (ret != len) {
return; return;
} }
at_frame_len_mail.frame_len = len; at_frame_len_mail.frame_len = len;
tos_mail_q_post(&at_agent->uart_rx_frame_mail, &at_frame_len_mail, sizeof(at_frame_len_mail_t)); tos_mail_q_post(&at_agent->uart_rx_frame_mail, &at_frame_len_mail, sizeof(at_frame_len_mail_t));
} }