修改OTA升级为双线程方式,边收数据边升级
This commit is contained in:
@@ -33,6 +33,10 @@ void sertrf_init(void)
|
||||
|
||||
//获取飞控代码地址
|
||||
sertrf.fc_address = parse_hex_or_dec(FC_ADDRESS);
|
||||
|
||||
//初始化环形buff
|
||||
rb_init(&sertrf.data_handle_buffer, DATA_HANDLE_BUFFER_SIZE, sizeof(uint8_t));
|
||||
|
||||
//线程启动
|
||||
sertrf_start();
|
||||
|
||||
@@ -44,13 +48,13 @@ void sertrf_start(void)
|
||||
"embedded_thread",
|
||||
embedded_thread,
|
||||
NULL,
|
||||
4096,
|
||||
2048,
|
||||
20);
|
||||
os_thread_create(&sertrf.pc_thread,
|
||||
"pc_thread",
|
||||
pc_thread,
|
||||
NULL,
|
||||
4096,
|
||||
2048,
|
||||
20);
|
||||
os_thread_create(&sertrf.app_thread,
|
||||
"app_thread",
|
||||
@@ -64,6 +68,12 @@ void sertrf_start(void)
|
||||
NULL,
|
||||
2048,
|
||||
10);
|
||||
os_thread_create(&sertrf.data_handle_thread,
|
||||
"data_handle_thread",
|
||||
data_handle_thread,
|
||||
NULL,
|
||||
4096,
|
||||
10);
|
||||
}
|
||||
void sertrf_rf_switch(uint8_t on)
|
||||
{
|
||||
@@ -210,6 +220,58 @@ void task_thread(void* arg)
|
||||
os_thread_sleep(100);
|
||||
}
|
||||
}
|
||||
|
||||
void data_handle_thread(void* arg)
|
||||
{
|
||||
while(true)
|
||||
{
|
||||
switch(sertrf.mode_status.task_state)
|
||||
{
|
||||
case DATA_HANDLE_OTA_DATA:
|
||||
{
|
||||
size_t data_size = rb_size(&sertrf.data_handle_buffer);
|
||||
if(data_size > 1024)
|
||||
{
|
||||
uint8_t data[data_size];
|
||||
rb_get_bulk(&sertrf.data_handle_buffer, data, data_size);
|
||||
|
||||
if(otau_write(&sertrf.otau, data, data_size))
|
||||
{
|
||||
SYS_LOG_DBG("stmisp write error");
|
||||
}
|
||||
else
|
||||
{
|
||||
SYS_LOG_DBG("stmisp write ok");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
case DATA_HANDLE_OTA_DATA_END:
|
||||
{
|
||||
size_t data_size = rb_size(&sertrf.data_handle_buffer);
|
||||
if(data_size > 0)
|
||||
{
|
||||
uint8_t data[data_size];
|
||||
rb_get_bulk(&sertrf.data_handle_buffer, data, data_size);
|
||||
if(otau_write(&sertrf.otau, data, data_size))
|
||||
{
|
||||
SYS_LOG_DBG("stmisp write error");
|
||||
}
|
||||
else
|
||||
{
|
||||
SYS_LOG_DBG("stmisp write ok");
|
||||
sertrf.mode_status.task_state = DATA_HANDLE_IDLE;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
os_thread_sleep(1);
|
||||
}
|
||||
}
|
||||
void pc_link_rgb_color(device_t* device)
|
||||
{
|
||||
static uint8_t last_connect = 255, last_wifi_mode = 0;
|
||||
@@ -338,27 +400,24 @@ void resend_user_parse(void *resend_device)
|
||||
break;
|
||||
case RESEND_CMD_OTA_DATA:
|
||||
{
|
||||
memcpy(sertrf.otau.ota_buff + sertrf.otau.ota_data_cnt, sertrf.resend_device.rx_frame.payload, sertrf.resend_device.rx_frame.len);
|
||||
|
||||
sertrf.otau.ota_data_cnt += sertrf.resend_device.rx_frame.len;
|
||||
// if(!sertrf.resend_device.status.resend_flag)
|
||||
if(sertrf.otau.ota_data_cnt >= 20480 )
|
||||
protocol_set_message_status(MESSAGE_OTA);
|
||||
// 使用环形buff
|
||||
if(rb_size(&sertrf.data_handle_buffer) + sertrf.resend_device.rx_frame.len <= DATA_HANDLE_BUFFER_SIZE)
|
||||
{
|
||||
SYS_LOG_DBG("KUYI_CMD_OTA_DATA %d\n", sertrf.resend_device.rx_frame.seq);
|
||||
otau_write(&sertrf.otau, sertrf.otau.ota_buff, sertrf.otau.ota_data_cnt);
|
||||
sertrf.otau.ota_data_cnt = 0;
|
||||
rb_put_bulk(&sertrf.data_handle_buffer, sertrf.resend_device.rx_frame.payload, sertrf.resend_device.rx_frame.len);
|
||||
}
|
||||
else
|
||||
{
|
||||
SYS_LOG_DBG("RESEND_CMD_OTA_DATA buffer full");
|
||||
}
|
||||
resend_send_cmd(resend_device, RESEND_CMD_ACK, 0);
|
||||
}
|
||||
break;
|
||||
case RESEND_CMD_OTA_END:
|
||||
{
|
||||
if(sertrf.otau.ota_data_cnt > 0)
|
||||
{
|
||||
otau_write(&sertrf.otau, sertrf.otau.ota_buff, sertrf.otau.ota_data_cnt);
|
||||
sertrf.otau.ota_data_cnt = 0;
|
||||
}
|
||||
// if(!sertrf.resend_device.status.resend_flag)
|
||||
sertrf.mode_status.task_state = DATA_HANDLE_OTA_DATA_END;
|
||||
while (sertrf.mode_status.task_state != DATA_HANDLE_IDLE){
|
||||
os_thread_sleep(10);}
|
||||
otau_end(&sertrf.otau);
|
||||
resend_send_cmd(resend_device, RESEND_CMD_ACK, 0);
|
||||
os_thread_sleep(2);
|
||||
|
||||
Reference in New Issue
Block a user