当前位置: 首页 > news >正文

新乡营销型网站建设军事热点最新情况

新乡营销型网站建设,军事热点最新情况,宁波网站建设主页,无安全警告的浏览器程序莫名死机跑飞,不知道问题,那么下面教你回溯错误源 回溯案发现场一、修改HardFault_Handler1. xx.s 在启动文件,找到HardFault_Handler。并修改。2. 定义HardFault_Handler_C函数。(主要是打印信息并存储Flash)3. 根…

程序莫名死机跑飞,不知道问题,那么下面教你回溯错误源

回溯案发现场

  • 一、修改HardFault_Handler
    • 1. xx.s 在启动文件,找到HardFault_Handler。并修改。
    • 2. 定义HardFault_Handler_C函数。(主要是打印信息并存储Flash)
    • 3. 根据回读PC和LR地址,通过MAP文件找到对应位置,判断引起硬件错误的原因。
  • 二、定义DefaultISR,查看是否有中断未声明
  • 三、如果使用了RTX,则需要重定义osRtxErrorNotify函数。
  • 四、读取错误信息
  • 举例

jianqiang.xue



一、修改HardFault_Handler

1. xx.s 在启动文件,找到HardFault_Handler。并修改。

HardFault_Handler\PROCEXPORT  HardFault_Handler         [WEAK]MOV     R0, spIMPORT  HardFault_Handler_CBL      HardFault_Handler_CENDP

2. 定义HardFault_Handler_C函数。(主要是打印信息并存储Flash)

void HardFault_Handler_C(unsigned int* hardfault_args) {HardFault_t info;info.r0 = ((unsigned long)hardfault_args[0]);info.r1 = ((unsigned long)hardfault_args[1]);info.r2 = ((unsigned long)hardfault_args[2]);info.r3 = ((unsigned long)hardfault_args[3]);info.r12 = ((unsigned long)hardfault_args[4]);info.lr = ((unsigned long)hardfault_args[5]);info.pc = ((unsigned long)hardfault_args[6]);info.psr = ((unsigned long)hardfault_args[7]);info.BFAR = (*((volatile unsigned long*)(0xE000ED38)));info.CFSR = (*((volatile unsigned long*)(0xE000ED28)));info.HFSR = (*((volatile unsigned long*)(0xE000ED2C)));info.DFSR = (*((volatile unsigned long*)(0xE000ED30)));info.AFSR = (*((volatile unsigned long*)(0xE000ED3C)));info.SCB_SHCSR = SCB->SHCSR;uint8_t data[70], len = 0;len = snprintf((char *)data,70, "\n[Hard fault handler - all num in hex] %x\r\n", *hardfault_args);McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "R0 = %x\r\nR1 = %x\r\nR2 = %x\r\nR3 = %x\r\n", info.r0, info.r1, info.r2, info.r3);McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "R12 = %x\r\n", info.r12);McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "LR [R14] = %x,subroutine call return address\r\n", info.lr);McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "PC [R15] = %x,program counter\r\n", info.pc);McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "PSR = %x\r\nBFAR = %lx\r\n", info.psr, (*((volatile unsigned long*)(0xE000ED38))));McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "CFSR = %lx\r\nHFSR = %lx\r\nDFSR = %lx\r\n",(*((volatile unsigned long*)(0xE000ED28))), (*((volatile unsigned long*)(0xE000ED2C))), (*((volatile unsigned long*)(0xE000ED30))));McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "AFSR = %lx\r\nSCB_SHCSR = %x\r\n",(*((volatile unsigned long*)(0xE000ED3C))), SCB->SHCSR);McuUartWriteString(&ble_uart, data, len);info.event = 0;kv_set_env(0xFF00, &info, sizeof(HardFault_t)); // 记录到Flashwhile (1);
}

3. 根据回读PC和LR地址,通过MAP文件找到对应位置,判断引起硬件错误的原因。

二、定义DefaultISR,查看是否有中断未声明

#define VECTORNUM    (*(volatile uint32_t*)(0xE000ED04))
void DefaultISR(void) {HardFault_t info;uint8_t data[50], len;len = sprintf((char *)data, "\n default_isr %d,%x \n", (uint8_t)VECTORNUM, (uint32_t)VECTORNUM);McuUartWriteString(&ble_uart, data, len);info.event = 1;info.VECTORNUM_ADDR = VECTORNUM;kv_set_env(0xFF00, &info, sizeof(HardFault_t)); // 记录到Flashwhile(1);
}

根据打印出来的数据,判断VECTOR,是怎么原因触发中断的。查对应芯片向量表,得知导致原因。
在这里插入图片描述

在这里插入图片描述

三、如果使用了RTX,则需要重定义osRtxErrorNotify函数。

uint32_t osRtxErrorNotify(uint32_t code, void* object_id) {HardFault_t info;(void)object_id;uint8_t data[100], len = 0;switch (code) {case osRtxErrorStackOverflow:len = sprintf((char *)data, "\n Stack overflow detected for thread (thread_id=0x%x)\n", (uint32_t)object_id);McuUartWriteString(&ble_uart, data, len);// Stack overflow detected for thread (thread_id=object_id)break;case osRtxErrorISRQueueOverflow:len = sprintf((char *)data, "\n ISR Queue overflow detected when inserting object 0x%x\n", (uint32_t)object_id);McuUartWriteString(&ble_uart, data, len);// ISR Queue overflow detected when inserting object (object_id)break;case osRtxErrorTimerQueueOverflow:len = sprintf((char *)data, "\n User Timer Callback Queue overflow detected for timer (timer_id=0x%x)\n", (uint32_t)object_id);McuUartWriteString(&ble_uart, data, len);// User Timer Callback Queue overflow detected for timer (timer_id=object_id)break;case osRtxErrorClibSpace:len = sprintf((char *)data, "\n Standard C/C++ library libspace not available: increase OS_THREAD_LIBSPACE_NUM 0x%x\n", (uint32_t)object_id);McuUartWriteString(&ble_uart, data, len);// Standard C/C++ library libspace not available: increase OS_THREAD_LIBSPACE_NUMbreak;case osRtxErrorClibMutex:len = sprintf((char *)data, "\n Standard C/C++ library mutex initialization failed 0x%x\n", (uint32_t)object_id);McuUartWriteString(&ble_uart, data, len);// Standard C/C++ library mutex initialization failedbreak;default:// Reservedbreak;}info.event = 2;info.RTX_CODE = code;info.RTX_OBJ_ID = (uint32_t)object_id;kv_set_env(0xFF00, &info, sizeof(HardFault_t)); // 记录到Flashfor (;;) {}// return 0U;
}

四、读取错误信息

采用ATCMD读取,如下

#ifdef ATCMD_EN
// 在功能模块中定义一个标准函数
static int atcmd_backtrack(atcmd_pack_t *pack) {HardFault_t *info = NULL;uint8_t buff[100], len;info = kv_get_env(0xFF00);if (info == NULL) {strcat((char*)buff, AT_ERROR);} else {if (info->event == 0) {len = snprintf((char *)buff, 100, "R0 = %x\r\nR1 = %x\r\nR2 = %x\r\nR3 = %x\r\nR12 = %x\r\n", info->r0, info->r1, info->r2, info->r3, info->r12);pack->reply(buff, strlen((char*)buff));len = snprintf((char *)buff, 100, "LR [R14] = %x,subroutine call return address\r\n", info->lr);pack->reply(buff, strlen((char*)buff));len = snprintf((char *)buff, 100, "PC [R15] = %x,program counter\r\n", info->pc);pack->reply(buff, strlen((char*)buff));len = snprintf((char *)buff, 100, "PSR = %x\r\nBFAR = %lx\r\n", info->psr, (*((volatile unsigned long*)(0xE000ED38))));pack->reply(buff, strlen((char*)buff));len = snprintf((char *)buff, 100, "CFSR = %lx\r\nHFSR = %lx\r\nDFSR = %lx\r\n",(*((volatile unsigned long*)(0xE000ED28))), (*((volatile unsigned long*)(0xE000ED2C))), (*((volatile unsigned long*)(0xE000ED30))));pack->reply(buff, strlen((char*)buff));len = snprintf((char *)buff, 100, "AFSR = %lx\r\nSCB_SHCSR = %x\r\n",(*((volatile unsigned long*)(0xE000ED3C))), SCB->SHCSR);pack->reply(buff, strlen((char*)buff));memset(buff, 0, 100);} else if (info->event == 1) {len = snprintf((char *)buff, 100, "\n default_isr %d,%x \n", (uint8_t)info->VECTORNUM_ADDR, (uint32_t)info->VECTORNUM_ADDR);} else if (info->event == 2) {len = snprintf((char *)buff, 100, "\n RTX_ERR CODE=0x%x, OBJ_ID=0x%x \n", (uint8_t)info->RTX_CODE, (uint32_t)info->RTX_OBJ_ID);}strcat((char*)buff, AT_OK);}pack->reply(buff, strlen((char*)buff));return 0;
}// 注册AT指令,传入标准函数
ATCMD_INIT("AT+BACKTRACK?", atcmd_backtrack);
#endif

举例

/********************************************************************************* @file    backtrack.c* @author  jianqiang.xue* @Version V1.0.0* @Date    2023-02-10* @brief   记录错误原因,方便追溯问题源********************************************************************************/
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>#include "cmsis_os2.h"
#include "os_api.h"
#include "SKEAZ1284.h"
#include "atcmd_slave.h" // 自行添加[Module\atcmd\atcmd_slave.c]#include "kv_sys.h"
#include "mcu_uart.h"
#include "ecu_cc2642.h"
#include "edebug.h"typedef struct __PACKED {uint32_t event; // 0--HardFault 1--DefaultISR 2--osRtxErrorNotify// HardFault_Handleruint32_t r0;uint32_t r1;uint32_t r2;uint32_t r3;uint32_t r12;uint32_t lr;uint32_t pc;uint32_t psr;uint64_t BFAR;uint64_t CFSR;uint64_t HFSR;uint64_t DFSR;uint64_t AFSR;uint64_t SCB_SHCSR;// DefaultISRuint32_t VECTORNUM_ADDR;// osRtxErrorNotifyuint32_t RTX_CODE;uint32_t RTX_OBJ_ID;
} HardFault_t;void HardFault_Handler_C(unsigned int* hardfault_args) {HardFault_t info;info.r0 = ((unsigned long)hardfault_args[0]);info.r1 = ((unsigned long)hardfault_args[1]);info.r2 = ((unsigned long)hardfault_args[2]);info.r3 = ((unsigned long)hardfault_args[3]);info.r12 = ((unsigned long)hardfault_args[4]);info.lr = ((unsigned long)hardfault_args[5]);info.pc = ((unsigned long)hardfault_args[6]);info.psr = ((unsigned long)hardfault_args[7]);info.BFAR = (*((volatile unsigned long*)(0xE000ED38)));info.CFSR = (*((volatile unsigned long*)(0xE000ED28)));info.HFSR = (*((volatile unsigned long*)(0xE000ED2C)));info.DFSR = (*((volatile unsigned long*)(0xE000ED30)));info.AFSR = (*((volatile unsigned long*)(0xE000ED3C)));info.SCB_SHCSR = SCB->SHCSR;uint8_t data[70], len = 0;len = snprintf((char *)data,70, "\n[Hard fault handler - all num in hex] %x\r\n", *hardfault_args);McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "R0 = %x\r\nR1 = %x\r\nR2 = %x\r\nR3 = %x\r\n", info.r0, info.r1, info.r2, info.r3);McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "R12 = %x\r\n", info.r12);McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "LR [R14] = %x,subroutine call return address\r\n", info.lr);McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "PC [R15] = %x,program counter\r\n", info.pc);McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "PSR = %x\r\nBFAR = %lx\r\n", info.psr, (*((volatile unsigned long*)(0xE000ED38))));McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "CFSR = %lx\r\nHFSR = %lx\r\nDFSR = %lx\r\n",(*((volatile unsigned long*)(0xE000ED28))), (*((volatile unsigned long*)(0xE000ED2C))), (*((volatile unsigned long*)(0xE000ED30))));McuUartWriteString(&ble_uart, data, len);len = snprintf((char *)data,70, "AFSR = %lx\r\nSCB_SHCSR = %x\r\n",(*((volatile unsigned long*)(0xE000ED3C))), SCB->SHCSR);McuUartWriteString(&ble_uart, data, len);info.event = 0;kv_set_env(0xFF00, &info, sizeof(HardFault_t)); // 记录到Flashwhile (1);
}#define VECTORNUM    (*(volatile uint32_t*)(0xE000ED04))
void DefaultISR(void) {HardFault_t info;uint8_t data[50], len;len = sprintf((char *)data, "\n default_isr %d,%x \n", (uint8_t)VECTORNUM, (uint32_t)VECTORNUM);McuUartWriteString(&ble_uart, data, len);info.event = 1;info.VECTORNUM_ADDR = VECTORNUM;kv_set_env(0xFF00, &info, sizeof(HardFault_t)); // 记录到Flashwhile(1);
}uint32_t osRtxErrorNotify(uint32_t code, void* object_id) {HardFault_t info;(void)object_id;uint8_t data[100], len = 0;switch (code) {case osRtxErrorStackOverflow:len = sprintf((char *)data, "\n Stack overflow detected for thread (thread_id=0x%x)\n", (uint32_t)object_id);McuUartWriteString(&ble_uart, data, len);// Stack overflow detected for thread (thread_id=object_id)break;case osRtxErrorISRQueueOverflow:len = sprintf((char *)data, "\n ISR Queue overflow detected when inserting object 0x%x\n", (uint32_t)object_id);McuUartWriteString(&ble_uart, data, len);// ISR Queue overflow detected when inserting object (object_id)break;case osRtxErrorTimerQueueOverflow:len = sprintf((char *)data, "\n User Timer Callback Queue overflow detected for timer (timer_id=0x%x)\n", (uint32_t)object_id);McuUartWriteString(&ble_uart, data, len);// User Timer Callback Queue overflow detected for timer (timer_id=object_id)break;case osRtxErrorClibSpace:len = sprintf((char *)data, "\n Standard C/C++ library libspace not available: increase OS_THREAD_LIBSPACE_NUM 0x%x\n", (uint32_t)object_id);McuUartWriteString(&ble_uart, data, len);// Standard C/C++ library libspace not available: increase OS_THREAD_LIBSPACE_NUMbreak;case osRtxErrorClibMutex:len = sprintf((char *)data, "\n Standard C/C++ library mutex initialization failed 0x%x\n", (uint32_t)object_id);McuUartWriteString(&ble_uart, data, len);// Standard C/C++ library mutex initialization failedbreak;default:// Reservedbreak;}info.event = 2;info.RTX_CODE = code;info.RTX_OBJ_ID = (uint32_t)object_id;kv_set_env(0xFF00, &info, sizeof(HardFault_t)); // 记录到Flashfor (;;) {}// return 0U;
}#ifdef ATCMD_EN
// 在功能模块中定义一个标准函数
static int atcmd_backtrack(atcmd_pack_t *pack) {HardFault_t *info = NULL;uint8_t buff[100], len;info = kv_get_env(0xFF00);if (info == NULL) {strcat((char*)buff, AT_ERROR);} else {if (info->event == 0) {len = snprintf((char *)buff, 100, "R0 = %x\r\nR1 = %x\r\nR2 = %x\r\nR3 = %x\r\nR12 = %x\r\n", info->r0, info->r1, info->r2, info->r3, info->r12);pack->reply(buff, strlen((char*)buff));len = snprintf((char *)buff, 100, "LR [R14] = %x,subroutine call return address\r\n", info->lr);pack->reply(buff, strlen((char*)buff));len = snprintf((char *)buff, 100, "PC [R15] = %x,program counter\r\n", info->pc);pack->reply(buff, strlen((char*)buff));len = snprintf((char *)buff, 100, "PSR = %x\r\nBFAR = %lx\r\n", info->psr, (*((volatile unsigned long*)(0xE000ED38))));pack->reply(buff, strlen((char*)buff));len = snprintf((char *)buff, 100, "CFSR = %lx\r\nHFSR = %lx\r\nDFSR = %lx\r\n",(*((volatile unsigned long*)(0xE000ED28))), (*((volatile unsigned long*)(0xE000ED2C))), (*((volatile unsigned long*)(0xE000ED30))));pack->reply(buff, strlen((char*)buff));len = snprintf((char *)buff, 100, "AFSR = %lx\r\nSCB_SHCSR = %x\r\n",(*((volatile unsigned long*)(0xE000ED3C))), SCB->SHCSR);pack->reply(buff, strlen((char*)buff));memset(buff, 0, 100);} else if (info->event == 1) {len = snprintf((char *)buff, 100, "\n default_isr %d,%x \n", (uint8_t)info->VECTORNUM_ADDR, (uint32_t)info->VECTORNUM_ADDR);} else if (info->event == 2) {len = snprintf((char *)buff, 100, "\n RTX_ERR CODE=0x%x, OBJ_ID=0x%x \n", (uint8_t)info->RTX_CODE, (uint32_t)info->RTX_OBJ_ID);}strcat((char*)buff, AT_OK);}pack->reply(buff, strlen((char*)buff));return 0;
}// 注册AT指令,传入标准函数
ATCMD_INIT("AT+BACKTRACK?", atcmd_backtrack);
#endif
http://www.15wanjia.com/news/168727.html

相关文章:

  • 自建站模板晨阳seo顾问
  • 网站优化大计扬中人才招聘网
  • 网站和网址的区别如何让做树洞网站
  • 山西省网站网站上面的彩票快3怎么做
  • 网站建设中需求分析说明书网页设计的步骤有哪些
  • 织梦手机网站源码下载为网站做seo需要什么软件
  • 商城的网站建设最新便民信息汇总
  • 一流的企业网站建设it运维有前途吗
  • 建立网站的步骤和费用网站更改模板 seo
  • 哔哩哔哩网站建设厦门某某公司网站
  • 市桥网站建设哪家好网站一级域名和二级域名
  • 济南网站建设yeptaskdw网页制作破解版
  • 静态网页制作网站优秀网页设计鉴赏
  • 中国建设银行网站会员用户名企业查询天眼查免费
  • 大连建设主管部门官方网站建设工程施工员考试在哪个网站
  • 平台网站建设设计网站排名优化手机
  • 卧龙区网站建设页面百度热搜榜怎么打开
  • 付公司网站建设费用会计分录威海网站建设 孔
  • 什么直播可以做游戏视频网站吗3d网页游戏排行
  • wordpress百度小程序插件seo快速排名软件案例
  • 网站忘记密码功能事件营销的步骤
  • 网站被黑 原因金融机构网站建设费用
  • 南京网站建设 雷仁网开源企业建站系统哪个好
  • 网站模板和后台哪里可以做免费的物流网站
  • 服装型网站开发太原顶呱呱做网站地址电话
  • 提供网站建设公司电话怎么用本机ip做网站
  • 网站正在建设中网页初中作文优秀作文
  • 网站功能及报价网页设计的设计思路怎么写
  • 大连市住房和建设局网站wordpress设置目录
  • 网站做标准曲线wordpress主题html