From f0f36cf79a659297c0df2800b2f06f153d7ae68a Mon Sep 17 00:00:00 2001 From: ranchuan Date: Wed, 11 Oct 2023 18:10:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E8=B5=8B=E7=A0=81=E4=BB=AA?= =?UTF-8?q?=E4=B8=BB=E6=9D=BF=20app=E5=8D=87=E7=BA=A7=EF=BC=8C=E6=96=B9?= =?UTF-8?q?=E6=A1=88=E5=8D=87=E7=BA=A7=E9=AA=8C=E8=AF=81=E9=80=9A=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- checher_slave.uvoptx | 38 ++---- checher_slave.uvprojx | 10 -- doc/JW3425_boot_v11.bin | Bin 0 -> 4056 bytes doc/creat_jwt_boot.py | 2 +- python/protmcu.py | 11 +- source/ReadMe.txt | 6 + source/dev/dev_flash.c | 7 +- source/dev/dev_flash.h | 15 +-- source/elec_det/elec_cmd.c | 2 + source/elec_det/elec_det.c | 97 +++++++++++++-- source/elec_det/elec_det.h | 4 + source/elec_det/interface/EWChecker.c | 1 + source/interface/if_can.c | 2 + source/interface/if_uart.c | 3 + source/main/compiler_info.h | 2 +- source/main/main.c | 119 ++---------------- source/mycopy.py | 1 + source/rt_thread/board.c | 2 +- source/soft/debug.h | 4 +- source/soft/mystdlib.c | 2 + source/task/prot_uc.c | 24 +++- source/task/prot_uc.h | 2 + source/task/tran_for_slave.c | 171 +++++++++++++++++++++----- source/task/transmit.c | 3 - 25 files changed, 324 insertions(+), 207 deletions(-) create mode 100644 doc/JW3425_boot_v11.bin diff --git a/.gitignore b/.gitignore index 2248133..59e7c65 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,5 @@ python/build/ python/dist/ *.xlsx *.json -quest_info.txt \ No newline at end of file +quest_info.txt +*.jwt \ No newline at end of file diff --git a/checher_slave.uvoptx b/checher_slave.uvoptx index 41a04fe..45c2405 100644 --- a/checher_slave.uvoptx +++ b/checher_slave.uvoptx @@ -164,7 +164,7 @@ 1 - 0 + 8 0x0801d000 0 @@ -389,7 +389,7 @@ 1 0 - 0x08036000 + 0x08004000 0 @@ -1634,18 +1634,6 @@ 0 0 0 - .\source\task\tran_for_coder2ch.c - tran_for_coder2ch.c - 0 - 0 - - - 10 - 92 - 1 - 0 - 0 - 0 .\source\task\mod_signals.c mod_signals.c 0 @@ -1653,7 +1641,7 @@ 10 - 93 + 92 1 0 0 @@ -1673,7 +1661,7 @@ 0 11 - 94 + 93 1 0 0 @@ -1693,7 +1681,7 @@ 0 12 - 95 + 94 1 0 0 @@ -1705,7 +1693,7 @@ 12 - 96 + 95 1 0 0 @@ -1717,7 +1705,7 @@ 12 - 97 + 96 1 0 0 @@ -1729,7 +1717,7 @@ 12 - 98 + 97 1 0 0 @@ -1741,7 +1729,7 @@ 12 - 99 + 98 1 0 0 @@ -1753,7 +1741,7 @@ 12 - 100 + 99 1 0 0 @@ -1773,7 +1761,7 @@ 0 13 - 101 + 100 5 0 0 @@ -1793,7 +1781,7 @@ 0 14 - 102 + 101 5 0 0 @@ -1805,7 +1793,7 @@ 14 - 103 + 102 5 0 0 diff --git a/checher_slave.uvprojx b/checher_slave.uvprojx index 6be32e7..bacb51a 100644 --- a/checher_slave.uvprojx +++ b/checher_slave.uvprojx @@ -928,11 +928,6 @@ 1 .\source\task\transmit.c - - tran_for_coder2ch.c - 1 - .\source\task\tran_for_coder2ch.c - mod_signals.c 1 @@ -3492,11 +3487,6 @@ 1 .\source\task\transmit.c - - tran_for_coder2ch.c - 1 - .\source\task\tran_for_coder2ch.c - mod_signals.c 1 diff --git a/doc/JW3425_boot_v11.bin b/doc/JW3425_boot_v11.bin new file mode 100644 index 0000000000000000000000000000000000000000..43b7f664f58e463ddd7e8f55fbd0eb793086d35d GIT binary patch literal 4056 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 literal 0 HcmV?d00001 diff --git a/doc/creat_jwt_boot.py b/doc/creat_jwt_boot.py index 1ad4434..7a6fcc6 100644 --- a/doc/creat_jwt_boot.py +++ b/doc/creat_jwt_boot.py @@ -5,7 +5,7 @@ import json -BOOT_PATH ="JW3425_boot_v10.bin" +BOOT_PATH ="JW3425_boot_v11.bin" APP_PATH ="MS-IEpro20231007.bin" OUT_PATH = BOOT_PATH.split('.')[0]+".jwt" diff --git a/python/protmcu.py b/python/protmcu.py index 5b5264e..6a34ee6 100644 --- a/python/protmcu.py +++ b/python/protmcu.py @@ -131,10 +131,13 @@ class protm: -u=protm("com5") +u=protm("com7") # u.start_recv() # u.wait() -u.cmd=1 -u.addr=1 +u.addr=0 u.host_addr=0 -print(u.encode(bytearray()).hex(",")) +u.cmd=0x13 +print(u.encode(bytearray()).hex(" ")) +u.cmd=0x0c +print(u.encode(bytearray()).hex(" ")) + diff --git a/source/ReadMe.txt b/source/ReadMe.txt index 6944490..c8cf938 100644 --- a/source/ReadMe.txt +++ b/source/ReadMe.txt @@ -198,3 +198,9 @@ 自适应回复电流挡位,boot与app中均通信正常 全流程升级验证成功 拟实现主机发开始检测之后等待300ms再启动检测,防止主机未收到回应 +2023.10.11 + 解决 tappend 多次加入相同临时指针时返回NULL指针的问题 + prot_uc 最多接收消息数量上限是10 ,防止主机消息轰炸 + prot_uc 处理命令的时间如果距离接收时间超过100ms时视为过期,不处理过期消息 + bootloader 在升级之前会进行校验,如果不是slave的程序则不会升级 + 使用赋码仪主板 app升级,方案升级验证通过 \ No newline at end of file diff --git a/source/dev/dev_flash.c b/source/dev/dev_flash.c index bd81ff3..eb269d9 100644 --- a/source/dev/dev_flash.c +++ b/source/dev/dev_flash.c @@ -106,7 +106,12 @@ static int flash_erase(uint32_t sector) } } - +// 擦除指定地址 +int flash_erase_addr(uint32_t addr) +{ + addr=addr-FLASH_BASE; + return flash_erase(addr/2048); +} // 操作开始 int flash_operate_start(void) diff --git a/source/dev/dev_flash.h b/source/dev/dev_flash.h index 3ae71b1..6df0779 100644 --- a/source/dev/dev_flash.h +++ b/source/dev/dev_flash.h @@ -35,6 +35,7 @@ uint32_t *flash_get_jwtcode(void); int flash_write(uint8_t *addr,const uint8_t *data,int len); int flash_operate_end(void); int flash_write_with_erase(uint8_t *addr,const uint8_t *data,int len); +int flash_erase_addr(uint32_t addr); @@ -48,6 +49,7 @@ typedef struct{ uint8_t host_ip[4]; int host_port; char host_if[8]; + char device_type[12]; }rom_head; @@ -68,17 +70,10 @@ typedef struct{ char host_if[8];// 主机接口 char device_type[12];// 设备类型 ,批检仪还是赋码仪 uint8_t mac[8];// mac地址 - uint8_t local_ip[4];// 本机ip地址 - uint8_t host_ip[4];// 主机ip地址 - int host_port;// 主机端口 - int local_cmd_port;// 本机命令端口 - int host_log_port;// 主机log端口 int local_id;// 本机识别号 - uint8_t host_log_ip[4];// 主机logip - int uartbsp;// 串口4的波特率 - int coder_ret_mode;// 注码指令返回格式 - int slave_addr_start;// 小板起始地址 - int moter_max_count;// 电机最大步数 + int uartbsp;// 串口的波特率 + int hard_version;// 硬件版本号 + int resistor_diff;// 电阻校准值 }sys_param_def; diff --git a/source/elec_det/elec_cmd.c b/source/elec_det/elec_cmd.c index a8e16ad..da7a273 100644 --- a/source/elec_det/elec_cmd.c +++ b/source/elec_det/elec_cmd.c @@ -79,6 +79,8 @@ static int cmd_iic_updata(list_def *argv) if(ret==0){ MC_IICUpdateMTP(); ret=checker_runcfg.excue_rtv; + }else{ + cmd_print("power set failed."); } PowerCalibration_set(POWER_DEF_V,45); POWER_OFF; diff --git a/source/elec_det/elec_det.c b/source/elec_det/elec_det.c index de2e454..eb07dda 100644 --- a/source/elec_det/elec_det.c +++ b/source/elec_det/elec_det.c @@ -2,6 +2,8 @@ #include "bytearray.h" #include "mystdlib.h" #include "debug.h" +#include "stdlib.h" +#include "dev_flash.h" #include "elec_det.h" #include "base/delay.h" @@ -27,6 +29,7 @@ typedef struct{ CheckerTask_Info_st* task_info_array[PLAN_MAX_TASK];//方案参数结构体指针 int scheme_inited; + array_def *data; }self_def; @@ -38,13 +41,23 @@ static self_def g_self; // 初始化 int elec_init(void) { - self_def *s=&g_self; void Ye_BoardInit(void); - void Ye_BoardCheck(void); + int elec_parper_power(void); + Ye_BoardInit(); + elec_bootinfo(); + DBG_LOG("local addr:%d.",elec_local_addr()); + return elec_scheme_init(); +} + + +// 初始化方案 +int elec_scheme_init(void) +{ + self_def *s=&g_self; + int ret=0; int elec_check_scheme(void); void elec_load_scheme(void); - Ye_BoardInit(); - Ye_BoardCheck(); + int elec_parper_power(void); if(elec_check_scheme()!=0){ // 方案校验失败 DBG_WARN("scheme check failed."); @@ -53,10 +66,36 @@ int elec_init(void) } s->scheme_inited=1; elec_load_scheme(); - return 0; + ret=elec_parper_power(); + return ret; } +// 调压 +static int elec_parper_power(void) +{ + self_def *s=&g_self; + CheckerTask_Info_st *task_par=0; + int ret=0; + task_par= s->task_info_array[0]; + if(task_par->taskid!=0){ + // 第一个任务不是调压任务,失败 + DBG_WARN("parper power failed,first taskid is not 0."); + return 1; + } + // 装载参数 + checker_runcfg.power_prapare_exe=0; + rt_memcpy(&checker_runcfg.task_info,task_par,sizeof(CheckerTask_Info_st)); + checker_runcfg.param_count = checker_runcfg.task_info.param_rtv_count & 0x0F; + checker_runcfg.rtv_count = (checker_runcfg.task_info.param_rtv_count >> 4) & 0x0F; + rt_memcpy(checker_runcfg.params,checker_runcfg.task_info.params,checker_runcfg.param_count*2); + Checker_PowerPrapare(); + ret=checker_runcfg.excue_rtv; + if(ret){ + DBG_WARN("parper power failed,ret=%d.",ret); + } + return ret; +} @@ -64,8 +103,9 @@ int elec_init(void) uint8_t elec_local_addr(void) { static uint8_t addr=0; - if(addr==0) + if(addr==0){ addr=Gpio_GetDeivceAddr(); + } return addr; } @@ -84,11 +124,34 @@ void elec_led2_power(int power) + +// 获取自检参数 +array_def *elec_bootinfo(void) +{ + void Ye_BoardCheck(void); + Ye_BoardCheck(); + board_st.hard_v=sys_param()->hard_version; + board_st.resistor_diff=sys_param()->resistor_diff; + board_st.hard_v=15; + array_def *r=arr_creat(); + arr_append(r,0); + arr_appends(r,&board_st,sizeof(BoartCheck_st)); + return arr_temp(r); +} + + + // 获取检测结果 array_def *elec_check_result(void) { - array_def *r=arr_creat(); - arr_append(r,3); + self_def *s=&g_self; + array_def *r=0; + if(s->data){ + r=arr_duplicate(s->data); + }else{ + r=arr_creat(); + arr_append(r,2); + } return arr_temp(r); } @@ -96,8 +159,14 @@ array_def *elec_check_result(void) // 写硬件版本号 array_def *elec_write_hardversion(int version) { - array_def *r=arr_creat(); + sys_param_def *spar=0; + spar=calloc(1,sizeof(sys_param_def)); + memcpy(spar,sys_param(),sizeof(sys_param_def)); + spar->hard_version=version; + flash_save_param(spar); + free(spar); board_st.hard_v=version; + array_def *r=arr_creat(); arr_append(r,0); return arr_temp(r); } @@ -107,8 +176,14 @@ array_def *elec_write_hardversion(int version) // 写电阻校准值 array_def *elec_write_resistor_cbv(int cbv) { - array_def *r=arr_creat(); + sys_param_def *spar=0; + spar=calloc(1,sizeof(sys_param_def)); + memcpy(spar,sys_param(),sizeof(sys_param_def)); + spar->resistor_diff=cbv; + flash_save_param(spar); + free(spar); board_st.resistor_diff=cbv; + array_def *r=arr_creat(); arr_append(r,0); return 0; } @@ -283,6 +358,8 @@ array_def *elec_check_with_scheme(array_def *uid_psw) arr_appends(r,checker_runcfg.Task_Result,8); arr_appends(r,checker_runcfg.Task_Excute,8); arr_appends(r,checker_runcfg.Test_Rtv,checker_runcfg.rtv_index*2); + CHECK_DO(s->data,arr_delete); + s->data=arr_duplicate(r); return arr_temp(r); } diff --git a/source/elec_det/elec_det.h b/source/elec_det/elec_det.h index d415c36..37e51cc 100644 --- a/source/elec_det/elec_det.h +++ b/source/elec_det/elec_det.h @@ -8,12 +8,16 @@ int elec_init(void); +int elec_scheme_init(void); + uint8_t elec_local_addr(void); void elec_led1_power(int power); void elec_led2_power(int power); +array_def *elec_bootinfo(void); + array_def *elec_check_result(void); array_def *elec_write_hardversion(int version); diff --git a/source/elec_det/interface/EWChecker.c b/source/elec_det/interface/EWChecker.c index b6b7e64..8ffc850 100644 --- a/source/elec_det/interface/EWChecker.c +++ b/source/elec_det/interface/EWChecker.c @@ -219,6 +219,7 @@ static int EW_appRead(void) DBG_LOG("addr=0x%02x.",addr); ret=EW_ReadMTP(1,addr,read_buf,4); DBG_LOG("ret=%d,dat=%02x,%02x,%02x,%02x,",ret,read_buf[0],read_buf[1],read_buf[2],read_buf[3]); + return ret; } static int cmd_jwt_app_read(list_def *argv) { diff --git a/source/interface/if_can.c b/source/interface/if_can.c index 0b9dc9f..7ecb4fe 100644 --- a/source/interface/if_can.c +++ b/source/interface/if_can.c @@ -369,6 +369,8 @@ static int h_init(uart_def *u,int bsp) { h_self_def *h=&g_hself; if(h->inited) return 0; + // 设置主机接口 int类型,0uart,1can + app_variable("host_if",&h->dev_index,0); h->dev[0]=dev_get("uart1"); h->dev[1]=dev_get("can"); h->dev[0]->init(h->dev[0],0); diff --git a/source/interface/if_uart.c b/source/interface/if_uart.c index bd891cc..98fdcff 100644 --- a/source/interface/if_uart.c +++ b/source/interface/if_uart.c @@ -386,6 +386,9 @@ static int write_block(uart_def *u,const uint8_t *b,int len) param_check(u->private_data); self_data *self=u->private_data; USART_TypeDef *uart=self->dtb->uart; + if(self->in_send){ + return 0; + } self->in_send=1; if(1){ dma_tx_init(self,b,len); diff --git a/source/main/compiler_info.h b/source/main/compiler_info.h index ccc35b6..76534ed 100644 --- a/source/main/compiler_info.h +++ b/source/main/compiler_info.h @@ -6,7 +6,7 @@ -#define BUILD_DATE "2023-10-10 16:36:03" +#define BUILD_DATE "2023-10-11 17:33:01" #define SOFT_VERSION "0.03" diff --git a/source/main/main.c b/source/main/main.c index 4681c0a..cee15d0 100644 --- a/source/main/main.c +++ b/source/main/main.c @@ -172,20 +172,8 @@ static void print_sys_param(const sys_param_def *par) cmd_print("device type: %s",par->device_type); cmd_print("mac addr: %02x.%02x.%02x.%02x.%02x.%02x", par->mac[0],par->mac[1],par->mac[2],par->mac[3],par->mac[4],par->mac[5]); - cmd_print("local ip: %d.%d.%d.%d", - par->local_ip[0],par->local_ip[1],par->local_ip[2],par->local_ip[3]); - cmd_print("host ip: %d.%d.%d.%d", - par->host_ip[0],par->host_ip[1],par->host_ip[2],par->host_ip[3]); - cmd_print("host port: %d",par->host_port); - cmd_print("local cmd port: %d",par->local_cmd_port); - cmd_print("host log port: %d",par->host_log_port); cmd_print("local id: %d",par->local_id); - cmd_print("host log ip: %d.%d.%d.%d", - par->host_log_ip[0],par->host_log_ip[1],par->host_log_ip[2],par->host_log_ip[3]); cmd_print("uart bsp: %d",par->uartbsp); - cmd_print("coder ret mode: %d",par->coder_ret_mode); - cmd_print("slave_addr_start: %d",par->slave_addr_start); - cmd_print("moter_max_count: %d",par->moter_max_count); } @@ -211,19 +199,10 @@ commend_export(sysinfo,sysinfo,"print the software info") static void print_sys_help(void) { cmd_print("example for how to set system params:"); - cmd_print("set hostif uart4/utcp"); + cmd_print("set hostif can/uart1/host"); cmd_print("set devicetype checker/coder"); - cmd_print("set localip 192.168.80.10"); - cmd_print("set hostip 192.168.80.100"); - cmd_print("set hostport 7777"); - cmd_print("set localcmdport 7777"); - cmd_print("set hostlogport 12345"); cmd_print("set localid 1"); - cmd_print("set hostlogip 192.168.80.80"); - cmd_print("set uartbsp 115200"); - cmd_print("set codermode 1/0"); - cmd_print("set slave_addr_start 1/0"); - cmd_print("set moter_max_count 0~30000"); + cmd_print("set uartbsp 57600"); cmd_print("set save"); } @@ -271,46 +250,6 @@ static int sys_set(list_def *argv) memcpy(spar->device_type,str,strlen(str)+1); cmd_print("device type: %s",spar->device_type); } - else if(strcmp(list_get_str(argv,1),"localip")==0) - { - char *str=list_get_str(argv,2); - list_def *ip=str_atod_list(str,'.'); - spar->local_ip[0]=list_get_int(ip,0); - spar->local_ip[1]=list_get_int(ip,1); - spar->local_ip[2]=list_get_int(ip,2); - spar->local_ip[3]=list_get_int(ip,3); - cmd_print("local ip: %d.%d.%d.%d", - spar->local_ip[0],spar->local_ip[1],spar->local_ip[2],spar->local_ip[3]); - } - else if(strcmp(list_get_str(argv,1),"hostip")==0) - { - char *str=list_get_str(argv,2); - list_def *ip=str_atod_list(str,'.'); - spar->host_ip[0]=list_get_int(ip,0); - spar->host_ip[1]=list_get_int(ip,1); - spar->host_ip[2]=list_get_int(ip,2); - spar->host_ip[3]=list_get_int(ip,3); - cmd_print("host ip: %d.%d.%d.%d", - spar->host_ip[0],spar->host_ip[1],spar->host_ip[2],spar->host_ip[3]); - } - else if(strcmp(list_get_str(argv,1),"hostport")==0) - { - char *str=list_get_str(argv,2); - spar->host_port=str_atoi(str); - cmd_print("host port: %d",spar->host_port); - } - else if(strcmp(list_get_str(argv,1),"localcmdport")==0) - { - char *str=list_get_str(argv,2); - spar->local_cmd_port=str_atoi(str); - cmd_print("local cmd port: %d",spar->local_cmd_port); - } - else if(strcmp(list_get_str(argv,1),"hostlogport")==0) - { - char *str=list_get_str(argv,2); - spar->host_log_port=str_atoi(str); - cmd_print("local log port: %d",spar->host_log_port); - } else if(strcmp(list_get_str(argv,1),"localid")==0) { char *str=list_get_str(argv,2); @@ -323,35 +262,6 @@ static int sys_set(list_def *argv) spar->uartbsp=str_atoi(str); cmd_print("uart bsp: %d",spar->uartbsp); } - else if(strcmp(list_get_str(argv,1),"hostlogip")==0) - { - char *str=list_get_str(argv,2); - list_def *ip=str_atod_list(str,'.'); - spar->host_log_ip[0]=list_get_int(ip,0); - spar->host_log_ip[1]=list_get_int(ip,1); - spar->host_log_ip[2]=list_get_int(ip,2); - spar->host_log_ip[3]=list_get_int(ip,3); - cmd_print("host log ip: %d.%d.%d.%d", - spar->host_log_ip[0],spar->host_log_ip[1],spar->host_log_ip[2],spar->host_log_ip[3]); - } - else if(strcmp(list_get_str(argv,1),"codermode")==0) - { - char *str=list_get_str(argv,2); - spar->coder_ret_mode=str_atoi(str); - cmd_print("coder ret mode: %d",spar->coder_ret_mode); - } - else if(strcmp(list_get_str(argv,1),"slave_addr_start")==0) - { - char *str=list_get_str(argv,2); - spar->slave_addr_start=str_atoi(str); - cmd_print("slave addr start: %d",spar->slave_addr_start); - } - else if(strcmp(list_get_str(argv,1),"moter_max_count")==0) - { - char *str=list_get_str(argv,2); - spar->moter_max_count=str_atoi(str); - cmd_print("moter_max_count: %d",spar->moter_max_count); - } else{ cmd_print("unknown cmd for sysset."); print_sys_help(); @@ -405,6 +315,10 @@ int main() uint8_t *rom; rom_head *head; rom=flash_get_rom(&head); + if(strcmp(head->device_type,"slave")!=0){ + // 如果不是小板的固件,本次不升级 + bk_reboot_guide(); + } param_init(head); if(rom) { @@ -464,14 +378,9 @@ void param_init(rom_head *h) memcpy(pars.pack_time,h->pack_time,20); if(pars.local_id==0xffffffff){ memcpy(pars.host_if,h->host_if,8); - memcpy(pars.device_type,"checker",8); + memcpy(pars.device_type,"slave",8); mac_init(pars.mac); - memcpy(pars.local_ip,h->local_ip,4); - memcpy(pars.host_ip,h->host_ip,4); - pars.host_port=h->host_port; - pars.local_cmd_port=7777; - pars.host_log_port=12345; - pars.local_id=1; + pars.local_id=0; } flash_save_param(&pars); } @@ -479,16 +388,10 @@ void param_init(rom_head *h) // 填充默认配置 if(pars.local_id==0xffffffff){ memcpy(pars.pack_time,"initial app",12); - memcpy(pars.host_if,"uart4",6); - memcpy(pars.device_type,"coder",6); + memcpy(pars.host_if,"host",6); + memcpy(pars.device_type,"slave",6); mac_init(pars.mac); - memcpy(pars.local_ip,(uint8_t []){192,168,80,10},4); - memcpy(pars.host_ip,(uint8_t []){192,168,80,80},4); - memcpy(pars.host_log_ip,(uint8_t []){192,168,80,80},4); - pars.host_port=9527; - pars.local_cmd_port=7777; - pars.host_log_port=12345; - pars.local_id=1; + pars.local_id=0; flash_save_param(&pars); } } diff --git a/source/mycopy.py b/source/mycopy.py index 5f27f73..90a78e6 100644 --- a/source/mycopy.py +++ b/source/mycopy.py @@ -122,6 +122,7 @@ def creat_head(data:bytearray,date:str): head+=arr_from_ip("192.168.80.100") head+=arr_from_int(7777) head+=arr_from_str("utcp",8) + head+=arr_from_str("slave",12) head+=arr_byte_copy(0,128-len(head)) # print(head) return head diff --git a/source/rt_thread/board.c b/source/rt_thread/board.c index c112833..d311223 100644 --- a/source/rt_thread/board.c +++ b/source/rt_thread/board.c @@ -97,9 +97,9 @@ void *dev_get(const char *name) void param_err_handle(const char *param,const char *file,const char *fun,int line) { - bk_reboot_param_err(); // printf("param=%s,file=%s,fun=%s,line=%d.\r\n",param,file,fun,line); DBG_ERR("param=%s,file=%s,fun=%s,line=%d.\r\n",param,file,fun,line); + bk_reboot_param_err(); while(1); } diff --git a/source/soft/debug.h b/source/soft/debug.h index 74d6ab7..4806e02 100644 --- a/source/soft/debug.h +++ b/source/soft/debug.h @@ -9,7 +9,7 @@ /*r{ 修改日志打印等级 }c*/ -#define DBG_LOG_LEVEL DBG_LEVEL_INFO +#define DBG_LOG_LEVEL 0 @@ -48,6 +48,8 @@ #define DBG_LOG_(type_,msg_,...)\ debug_log(__FILE__,__func__,__LINE__,type_,(msg_),##__VA_ARGS__) +//#define DBG_LOG_(type_,msg_,...)\ +// debug_log("-","-",__LINE__,type_,(msg_),##__VA_ARGS__) int debug_init(void); diff --git a/source/soft/mystdlib.c b/source/soft/mystdlib.c index 6224d60..eba93bf 100644 --- a/source/soft/mystdlib.c +++ b/source/soft/mystdlib.c @@ -356,6 +356,8 @@ void *tappend(void *p,void *del) if(tempptr_find(t,p)==0) { ret= tempptr_append(t,p,del); + }else{ + ret=p; } } rt_mutex_release(t->mutex); diff --git a/source/task/prot_uc.c b/source/task/prot_uc.c index a2e6f27..8fe75f8 100644 --- a/source/task/prot_uc.c +++ b/source/task/prot_uc.c @@ -19,9 +19,11 @@ // 接收buff大小 #define RECV_BUFF_SIZE 300 +// 最大接收信号个数 +#define RECV_SEM_MAX_NUM 10 - - +// 接收数据超时时间 +#define RECV_EXPIRE_TIME 100 @@ -87,7 +89,11 @@ static void recv_end_irq(void *t,uint32_t len) protu_def *p=t; p->num_to_recv=len; p->buff_index=len; - rt_sem_release(p->sem); + p->sem_num++; + if(p->sem_numsem); + p->recv_tick=rt_tick_get(); + } } array_def *protu_decode_str(protu_def *p,array_def *data); @@ -159,9 +165,21 @@ static void protu_run(void *t) protu_def *p=t; array_def *data; array_def *decode_data; + uint32_t tick_now; while(p->run) { rt_sem_take(p->sem,RT_WAITING_FOREVER); + p->sem_num=0; + if(p->buff_index==0){ + continue; + } + tick_now=rt_tick_get(); + if(tick_now-p->recv_tick>RECV_EXPIRE_TIME){ + DBG_LOG("recv data expired."); + p->num_to_recv=0; + p->buff_index=0; + continue; + } //DBG_LOG("protu run"); data=arr_creat(); arr_appends(data,p->buff,p->buff_index); diff --git a/source/task/prot_uc.h b/source/task/prot_uc.h index 41fc51e..07d87b7 100644 --- a/source/task/prot_uc.h +++ b/source/task/prot_uc.h @@ -23,6 +23,8 @@ struct _protu_def{ int buff_index; int num_to_recv; void *sem; + int sem_num; + uint32_t recv_tick; int run; char *str_err; uint16_t cmd_no; diff --git a/source/task/tran_for_slave.c b/source/task/tran_for_slave.c index 9bca286..8079ad1 100644 --- a/source/task/tran_for_slave.c +++ b/source/task/tran_for_slave.c @@ -19,18 +19,20 @@ typedef struct{ ucport_def u; rt_timer_t timer; - array_def *data; + int *host_type;// 主机接口类型0串口,1can }slave_def; - - -static void slave_dolater(ucport_def *u,int delay_ms) +static slave_def *slave_creat(void) { - slave_def *s=(slave_def *)u; + slave_def *u=calloc(1,sizeof(slave_def)); + u->host_type=app_variable("host_if",0,0); + return u; } + + static void slave_del(ucport_def *u) { slave_def *s=(slave_def *)u; @@ -43,13 +45,14 @@ static void slave_del(ucport_def *u) // 获取检测结果 static int check_result_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) { + slave_def *s=(slave_def *)u; emit tran_reply_signal(u->p,arr_temp(elec_check_result())); return 0; } static ucport_def *check_result(tran_def *t, uint8_t cmd,array_def *data) { int ret=0; - slave_def *u=calloc(1,sizeof(slave_def)); + slave_def *u=slave_creat(); u->u.p=t; u->u.del=slave_del; u->u.dolater=check_result_dolater; @@ -70,7 +73,7 @@ static int write_hw_version_dolater(ucport_def *u,uint8_t cmd,array_def *data,ch static ucport_def *write_hw_version(tran_def *t, uint8_t cmd,array_def *data) { int ret=0; - slave_def *u=calloc(1,sizeof(slave_def)); + slave_def *u=slave_creat(); u->u.p=t; u->u.del=slave_del; u->u.dolater=write_hw_version_dolater; @@ -94,7 +97,7 @@ static ucport_def *write_resistor_cbv(tran_def *t, uint8_t cmd,array_def *data) { int ret=0; int value=arr_get(data,0)|(arr_get(data,1)<<8); - slave_def *u=calloc(1,sizeof(slave_def)); + slave_def *u=slave_creat(); u->u.p=t; u->u.del=slave_del; u->u.dolater=write_resistor_cbv_dolater; @@ -115,7 +118,7 @@ static int check_resistor_dolater(ucport_def *u,uint8_t cmd,array_def *data,char static ucport_def *check_resistor(tran_def *t, uint8_t cmd,array_def *data) { int ret=0; - slave_def *u=calloc(1,sizeof(slave_def)); + slave_def *u=slave_creat(); u->u.p=t; u->u.del=slave_del; u->u.dolater=check_resistor_dolater; @@ -130,15 +133,74 @@ transmit_export(ym_slave,0x05,check_resistor) // 根据方案检测 +typedef struct{ + int submit_running; + int submit_delay;// 自动上报间隔 + int submit_times;// 自动上报次数 + tran_def *tran; + uint8_t cmd; + int host_type; + array_def *data; +}check_def; +static check_def g_check; +static void check_set_data(check_def *u,array_def *data) +{ + CHECK_DO(u->data,arr_delete); + u->data=arr_duplicate(data); +} +static void check_submit_later(void *t) +{ + check_def *s=(check_def *)t; + + s->submit_times--; + if(s->submit_running&&(s->submit_times>0)){ + emit tran_send_signal(s->tran,s->cmd,(elec_check_result())); + s->submit_delay+=elec_local_addr()*3; + later_execute(check_submit_later,s,s->submit_delay); + }else{ + s->submit_running=0; + s->submit_times=0; + s->cmd=0; + } +} +static void check_later(void *t) +{ + check_def *s=(check_def *)t; + elec_check_with_scheme(s->data); + if(s->host_type==1) + { + s->submit_times=10; + s->submit_running=1; + s->submit_delay=elec_local_addr()*3; + later_execute(check_submit_later,s,s->submit_delay); + }else{ + s->cmd=0; + } +} static int check_with_scheme_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) { - emit tran_reply_signal(u->p,arr_temp(elec_check_with_scheme(data))); + slave_def *s=(slave_def *)u; + check_def *c=&g_check; + array_def *r=arr_creat(); + if(c->cmd==0){ + c->cmd=cmd; + c->tran=s->u.p; + c->host_type=*s->host_type; + check_set_data(c,data); + later_execute(check_later,c,10); + } + if(c->cmd==cmd){ + arr_append(r,0); + }else{ + arr_append(r,2); + } + emit tran_reply_signal(u->p,arr_temp(r)); return 0; } static ucport_def *check_with_scheme(tran_def *t, uint8_t cmd,array_def *data) { int ret=0; - slave_def *u=calloc(1,sizeof(slave_def)); + slave_def *u=slave_creat(); u->u.p=t; u->u.del=slave_del; u->u.dolater=check_with_scheme_dolater; @@ -155,6 +217,7 @@ transmit_export(ym_slave,0x0c,check_with_scheme) // 停止上报 static int stop_submit_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) { + g_check.submit_running=0; array_def *r=arr_creat(); arr_append(r,0); emit tran_reply_signal(u->p,arr_temp(r)); @@ -163,7 +226,7 @@ static int stop_submit_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *e static ucport_def *stop_submit(tran_def *t, uint8_t cmd,array_def *data) { int ret=0; - slave_def *u=calloc(1,sizeof(slave_def)); + slave_def *u=slave_creat(); u->u.p=t; u->u.del=slave_del; u->u.dolater=stop_submit_dolater; @@ -182,11 +245,13 @@ transmit_export(ym_slave,0x14,stop_submit) // 本程序中程序下载地址不是这个地址,在此用来计算偏移量 #define MCU_APP_ADDR_BASE 0x8004000 #define MCU_TASKID_ADDR_BASE 0x803f000 +#define MCU_JWT_ADDR_BASE 0x803B000 // 定义升级结构体 typedef struct{ uint8_t device_state; uint32_t flash_addr; + uint32_t flash_addr_base; }updata_def; static updata_def g_updata; @@ -203,7 +268,7 @@ static int device_state_dolater(ucport_def *u,uint8_t cmd,array_def *data,char * static ucport_def *device_state(tran_def *t, uint8_t cmd,array_def *data) { int ret=0; - slave_def *u=calloc(1,sizeof(slave_def)); + slave_def *u=slave_creat(); u->u.p=t; u->u.del=slave_del; u->u.dolater=device_state_dolater; @@ -224,7 +289,7 @@ static int turn_to_bootloader_dolater(ucport_def *u,uint8_t cmd,array_def *data, static ucport_def *turn_to_bootloader(tran_def *t, uint8_t cmd,array_def *data) { int ret=0; - slave_def *u=calloc(1,sizeof(slave_def)); + slave_def *u=slave_creat(); u->u.p=t; u->u.del=slave_del; u->u.dolater=turn_to_bootloader_dolater; @@ -263,7 +328,7 @@ static int erase_app_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err static ucport_def *erase_app(tran_def *t, uint8_t cmd,array_def *data) { int ret=0; - slave_def *u=calloc(1,sizeof(slave_def)); + slave_def *u=slave_creat(); u->u.p=t; u->u.del=slave_del; u->u.dolater=erase_app_dolater; @@ -293,7 +358,7 @@ static int write_data_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *er static ucport_def *write_data(tran_def *t, uint8_t cmd,array_def *data) { int ret=0; - slave_def *u=calloc(1,sizeof(slave_def)); + slave_def *u=slave_creat(); u->u.p=t; u->u.del=slave_del; u->u.dolater=write_data_dolater; @@ -311,21 +376,26 @@ static int ceck_crc_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_ uint32_t addr_start=(arr_get(data,0))|(arr_get(data,1)<<8)|(arr_get(data,2)<<16)|(arr_get(data,3)<<24); uint32_t addr_end=(arr_get(data,4))|(arr_get(data,5)<<8)|(arr_get(data,6)<<16)|(arr_get(data,7)<<24); uint32_t crc32=(arr_get(data,8))|(arr_get(data,9)<<8)|(arr_get(data,10)<<16)|(arr_get(data,11)<<24); + uint32_t crc32_local=0; int len=addr_end-addr_start; - addr_start+=FLASH_FILE_HEAD_SIZE; - int ret=(crc32!=crc_crc32((uint8_t *)addr_start,len)); + addr_start=g_updata.flash_addr; + crc32_local=crc_crc32((uint8_t *)addr_start,len); + int ret=(crc32!=crc32_local); + if(ret){ + DBG_WARN("crc32 not equal,crc=0x%04x,crc_local=0x%04x",crc32,crc32_local); + } array_def *r=arr_creat(); arr_append(r,ret); emit tran_reply_signal(u->p,arr_temp(r)); if(ret==0){ - later_execute((void (*)(void *))bk_reboot_app,0,100); + later_execute((void (*)(void *))bk_reboot_updata,0,100); } return 0; } static ucport_def *ceck_crc(tran_def *t, uint8_t cmd,array_def *data) { int ret=0; - slave_def *u=calloc(1,sizeof(slave_def)); + slave_def *u=slave_creat(); u->u.p=t; u->u.del=slave_del; u->u.dolater=ceck_crc_dolater; @@ -346,10 +416,18 @@ static int write_data2_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *e int len=arr_length(data)-4; int ret=0; if((addr)==MCU_TASKID_ADDR_BASE){ - flash_erase_scheme(); + //flash_erase_scheme(); + // 只擦除两个扇区 + flash_erase_addr((uint32_t)flash_get_scheme()); + flash_erase_addr((uint32_t)flash_get_scheme()+2048); g_updata.flash_addr=creat_file_head((uint32_t)flash_get_scheme(),"scheme.bin"); + g_updata.flash_addr_base=MCU_TASKID_ADDR_BASE; + }else if((addr)==MCU_JWT_ADDR_BASE){ + flash_erase_jwtcode(); + g_updata.flash_addr=creat_file_head((uint32_t)flash_get_jwtcode(),"jwtcode.jwt"); + g_updata.flash_addr_base=MCU_JWT_ADDR_BASE; } - uint32_t offset=addr-MCU_TASKID_ADDR_BASE; + uint32_t offset=addr-g_updata.flash_addr_base; addr=g_updata.flash_addr+offset; ret=flash_write((uint8_t *)addr,&arr_data(data)[4],len); array_def *r=arr_creat(); @@ -360,7 +438,7 @@ static int write_data2_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *e static ucport_def *write_data2(tran_def *t, uint8_t cmd,array_def *data) { int ret=0; - slave_def *u=calloc(1,sizeof(slave_def)); + slave_def *u=slave_creat(); u->u.p=t; u->u.del=slave_del; u->u.dolater=write_data2_dolater; @@ -371,11 +449,48 @@ transmit_export(ym_slave,0x11,write_data2) - - - - - +// 重新加载方案 +static int load_scheme_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + int ret=0; + array_def *r=arr_creat(); + arr_append(r,ret); + emit tran_reply_signal(u->p,arr_temp(r)); + ret=elec_scheme_init(); + return 0; +} +static ucport_def *load_scheme(tran_def *t, uint8_t cmd,array_def *data) +{ + int ret=0; + slave_def *u=slave_creat(); + u->u.p=t; + u->u.del=slave_del; + u->u.dolater=load_scheme_dolater; + u->u.dolater(&u->u,cmd,data,"ok"); + return (ucport_def *)u; +} +transmit_export(ym_slave,0x15,load_scheme) + + + + +// 获取自检参数 +static int bootinfo_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str) +{ + emit tran_reply_signal(u->p,arr_temp(elec_bootinfo())); + return 0; +} +static ucport_def *bootinfo(tran_def *t, uint8_t cmd,array_def *data) +{ + int ret=0; + slave_def *u=slave_creat(); + u->u.p=t; + u->u.del=slave_del; + u->u.dolater=bootinfo_dolater; + u->u.dolater(&u->u,cmd,data,"ok"); + return (ucport_def *)u; +} +transmit_export(ym_slave,0x13,bootinfo) diff --git a/source/task/transmit.c b/source/task/transmit.c index 6fb7016..39354b3 100644 --- a/source/task/transmit.c +++ b/source/task/transmit.c @@ -305,9 +305,6 @@ static void when_scheme_done(ucport_def *u) DBG_WARN("can not fond variable \"tran\""); return; } - DBG_LOG("memused:%d",mem_perused()); - rt_thread_mdelay(100); - DBG_LOG("memused:%d",mem_perused()); } static ucport_def *tran_scheme(tran_def *t, uint8_t cmd,array_def *data) {