异常处理一例

news2024/11/30 0:30:34

1.现象

代码片段:

uint8_t CmdListener(char c)
{
#define CMD_SIZE 5
    static uint8_t cmdQueue[9];
    static uint8_t cmdReset[] = { '!', 'b', 'o', 'o', 't'};
    static uint8_t cmdYModem[] = { 0x01, 0x00, 0xff };
    static uint8_t cmdIdx = 0;
    int i;

    xlog("%c", 0xcc);
    for(int i = 0; i<sizeof(cmdReset); ++i)
    {
        xlog("%c", cmdReset[i]);
    }
    xlog("%c", 0xcd);
    xlog("%c", c);
    return;

实测结果:

2.排错

2.1 检查.hex文件,确认相关初始化字符在

map文件:

CmdListener@cmdReset                 dataBANK0    0000D6

上面是.map文件的记录。

Hex文件:

:040000000EEF00F00F
:0400080004EF1CF0F5
:080018000CEF1CF0BCEF0CF032
:100600000001000A006400E80310272747273A6723
:100610006F746F204170700D0A274C273A6C6F6120
:1006200064206669726D776172650D0A27487C3FA8
.hex文件,

代码从0x600开始排。代码是如何进入DataRam的?但是总归,这个21 62 6f 6f 74应该会在指令ROM里,对吧?搜索:

 指令ROM,  HEX文件里确实不存在这些信息。

2.2 重新编译,检查Warning.

无相关的Warning,但是检查出来额外的一处编码错误:

bool IsAppExisted(void)
{
    char *dstAddr = NEW_RESET_VECTOR;
    if(*dstAddr != 0xff) return true;
    return false;
}

相关的单片机是哈佛结构,很可能无法直接取指令ROM空间的地址,参与运算。查阅示例文件,改为如下形式:

bool IsAppExisted(void)
{
// ******************************************************************
//  Check the reset vector for code to initiate bootloader
// ******************************************************************
                                    // This section reads the application start
                                    // vector to see if the location is blank
    TBLPTR = NEW_RESET_VECTOR;      // (0xFF) or not.  If blank, it runs the
                                    // bootloader.  Otherwise, it assumes the
                                    // application is loaded and instead runs the
                                    // application.
    EECON1 = 0x80;
    asm("TBLRD *+");
    if (TABLAT == 0xFF)
    {
        return (false);
    }
	return (true);
}

2.3 关编译优化选项,重试

无改观。

2.4 查阅C99标准

 查阅 C99标准,支持。

2.5 查阅这几天调整过的有关初始化的编译开关

正常。

 3.检查编译器,寻找解决方案

查阅XC8 CC文档,发现:

我现在知道这个编译开关是为了什么目的存在的。所有的代码都在ROM里,所以,引入Bootloader后,你可以控制全局初始化中比如类似在Bootloader和APP中公用的部分,是否需要加载两次。比如:类似字库这类东西。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/741275.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LeetCode】HOT 100(27)

题单介绍&#xff1a; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的题目&#xff0c;适合初识算法与数据结构的新手和想要在短时间内高效提升的人&#xff0c;熟练掌握这 100 道题&#xff0c;你就已经具备了在代码世界通行的基本能力。 目录 题单介绍&#…

【Linux】ELK 企业级日志分析系统

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 ELK 企业级日志分析系统 ELK 概述1、ELK 简介2、为什么要使用 ELK3、完整日志系统基本特征4、ELK 的工作原理 ELK Elasticsearch 集群部署&#xff08;在Node1、Node2节点上操…

stm32(串口知识点)

HAL串口发送/接收函数&#xff1a; HAL_UART_Transmit(); 串口发送数据&#xff0c;使用超时管理机制HAL_UART_Receive(); 串口接收数据&#xff0c;使用超时管理机制HAL_UART_Transmit_IT(); 串口中断模式发送 HAL_UART_Receive_IT(); 串口中断模式接收 HAL_UART_Transmit(…

ByteBuddy学习笔记

ByteBuddy 1.ByteBuddy的用途 ByteBuddy通过修改字节码来新增、修改、删除Java类的现有功能&#xff0c;主要用于分离功能代码和非功能代码&#xff0c;比如 比如非功能代码如下&#xff1a; public double calculatePrice(){double discount getDiscount();double price …

【python手写算法】利用梯度下降实现线性拟合

利用梯度下降实现线性拟合&#xff0c;效果和sklearn LinearRegression()差不多。 学习率初始设置为0.1结果算高的&#xff0c;直接让我的参数变成了nan。&#xff08;体会到了飞出去的感觉&#xff09; 把学习率调小了之后就正常了 # codingutf-8 import matplotlib.pyplot a…

Android多渠道打包及资源指定

多渠道打包及资源指定 由于项目涉及多个车型&#xff0c;使用的是同一个base代码&#xff0c;不同车型都有差分项&#xff0c;所以需要进行多渠道打包&#xff0c;编译不同的资源进行编译处理 一、多渠道打包方式 productFlavor 背景 Android默认提供了Gradle插件库 class…

协同套件——“ 船 ”新版本

空地协同套件自前段时间推出后&#xff0c;受到了很多开发者的关注&#xff0c;不少开发者均表示对跨域机器人协同工作非常感兴趣&#xff0c;这也加快了我们协同套件的另一块拼图-船机协同的研发进度。近期&#xff0c;我们海空协同套件也顺利完成开发测试&#xff0c;本期将给…

基于炬芯3019 SDK数字助听器平台驱动设计与算法实现

+v hezkz17进数字音频系统答疑裙 1 针对数字助听器进行音频信号处理,达到助听功能的需求分析,使用三种语音处理算法。 三种语音处理算法包括:自动增益控制算法、移频算法以及宽动态范围压缩算法。 通过分析三种算法的基本原理,将算法分别使用MATLAB 进行仿真实现,验证算法…

LRU缓存替换策略及C#实现

LRU缓存替换策略 缓存是一种非常常见的设计&#xff0c;通过将数据缓存到访问速度更快的存储设备中&#xff0c;来提高数据的访问速度&#xff0c;如内存、CPU缓存、硬盘缓存等。 但与缓存的高速相对的是&#xff0c;缓存的成本较高&#xff0c;因此容量往往是有限的&#xf…

sqlite3交叉编译

1、交叉编译sqllite3可以先从官网下载最新最新的源码进行编译。sqlite3下载sqlite3有两种版本的源代码&#xff0c;sqlite-amalgamation-3420000.zip这种是将所有的操作放到sqlite3中进行使用的。虽然官方推荐使用这种方法。但是对于嵌入式移植还是使用sqlite-autoconf-3420000…

23款奔驰GLE450动感型升级柏林之声音响系统,体验不一样的感觉

奔驰GLE450动感型升级柏林之声的音响效果自然非同凡响&#xff0c;在人声、交响乐音乐厅感受方面都有非常逼真的现场感受&#xff0c;结合柏林之声的界面调整&#xff0c;可以在不同方位体验的高保真的音乐之享&#xff01; 小柏林音响总共13个喇叭1台功放由4个高音、4个中音、…

Linux 创建文件的12种方法总结

在Linux中&#xff0c;可以使用多种方法来创建文件。以下是一些常见的方法&#xff1a; 1. touch命令 touch filename&#xff0c;用于创建一个空文件。如果文件已存在&#xff0c;则只更新其访问时间和修改时间。 touch 命令通常用于将文件的访问和修改时间更新为当前时间。…

基于知识蒸馏的去雪、去雾、去雨算法

今天来详细学习一篇去雪、去雨、去雾三合一的去噪算法 代码地址&#xff1a; https://github.com/fingerk28/Two-stage-Knowledge-For-Multiple-Adverse-Weather-Removal 论文地址&#xff1a; https://openaccess.thecvf.com/content/CVPR2022/papers/Chen_Learning_Multiple_…

Python(二):Python简介

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

ELFK——ELK结合filebeat日志分析系统(纵使生活万般磨难,也要笑对生活)

文章目录 一、filebeat二、ELFK1.原理简介 三、部署FilebeatELK1.解压安装2.设置 filebeat 的主配置文件3.启动 filebeat4&#xff0e;在 Logstash 组件所在节点上新建一个 Logstash 配置文件5&#xff0e;测试 一、filebeat Filebeat&#xff0c;轻量级的开源日志文件数据搜集…

高精度电流源怎么用

高精度电流源是一种用于产生高精度、高稳定性和低噪声的直流或交流电流信号的设备。它主要应用于各种实验和测试领域&#xff0c;例如半导体器件测试、传感器校准、精密测量和医疗检测等。高精度电流源的作用是提供可靠的电流输出信号&#xff0c;在实验和测试中获得精确和准确…

聚焦地下停车场污染死角|气体检测仪让您一目了然

由于地下停车场属于封闭式或半封闭式建筑&#xff0c;近年来越来越多高端住宅、办公楼宇的物业管理者收到投诉反应地下停车场的空气质量差的问题。那么地下空气污染有哪些呢&#xff1f; 根据空气监测工程师的检测表明&#xff0c;与地面不同&#xff0c;地下停车场的汽车起动…

一次元数据空间内存溢出的排查记录 | 京东云技术团队

在应用中&#xff0c;我们使用的 SpringData ES的 ElasticsearchRestTemplate来做查询&#xff0c;使用方式不对&#xff0c;导致每次ES查询时都新实例化了一个查询对象&#xff0c;会加载相关类到元数据中。最终长时间运行后元数据出现内存溢出&#xff1b; 问题原因&#xf…

vue 动态引入图片地址的方法

我们直接使用 v-bind 的方式导入无法正常导入 <image :src"item.src" alt""/> 是因为 页面显示为htmlcssjs而vue变成我们可以看到的样子是需要打包变成htmlcssjs的&#xff0c; 在打包过程中将item.src的变量 取出变成/image/icon.svg只是 将地址…

集中式自动抄表系统原理与应用

集中式自动抄表系统是一种自动采集电表、水表、气表等计量数据的系统&#xff0c;其原理是通过一定的通信方式&#xff0c;将计量数据从表端传输到数据采集器&#xff0c;再由数据采集器上传至云端或后台处理系统&#xff0c;从而实现对表数据的自动采集、统计和分析。 集中式…