踩坑记 BSS段的初始化


title: 踩坑记 BSS段的初始化
category_bar: true
categories:

  • blog
    tags:
  • embedded
    date: 2023-10-20 19:23:05

前言

接手一个项目,调试全靠串口日志,测试同事测试产品的时候无法拿到日志,刚好产品RAM够大,且刚好有SD卡。所以就诞生了将日志缓存在RAM上,在特定条件下将它写到SD卡上的想法。
.
.
.
开工。
.
.
.
写完代码之后发现机器偶尔会无法启动,无法开机,无任何日志。
.
有的时候是烧录完成代码后重启无法启动,有些情况下是烧录完成代码后运行正常,放置一段时间后无法启动
.
有时候有些无法启动的机器放置一段时间又成功启动
.
.
.
一段一段代码,屏蔽,编译,验证,发现一个非常无法理解的事,TFCardLogBufferPut函数注释后设备可以正常启动。
.
.
.
看代码:

#define TF_CARD_LOG_BUFFER_SIZE     (64*1024ul)
uint8_t tfCardLogBuffer[TF_CARD_LOG_BUFFER_SIZE] = {0};
uint32_t tfCardLogBufferIndex = 0;void TFCardLogBufferPut(uint8_t data) {tfCardLogBuffer[tfCardLogBufferIndex] = data;tfCardLogBufferIndex++;if( tfCardLogBufferIndex>=(sizeof(tfCardLogBuffer)/sizeof(tfCardLogBuffer[0]))-1 ) {tfCardLogBufferIndex = 0;}
}

.
.
.
我实在无法理解,这段代码是如何导致设备无法启动的,后面搁置了一段时间,遂归结于小众芯片不完善导致。
.
.
.
但是后面这个需求实在是过于旺盛,遂重新开始验证代码。

当时代码是这样的:

// main.c
int main(int argc, char **argv) {hal_uartInit();ax32xx_uart0SendByte('a');ax32xx_uart0SendByte('b');hal_uartSendData('1');hal_uartSendData('2');ax32xx_uart0SendByte('c');hal_sysInit();//.... some code here
}// uart.c
void hal_uartSendData(u8 data)
{ax32xx_uart0SendByte(data);TFCardLogBufferPut(data);
}void ax32xx_uart0SendByte(u8 data)
{R_UART_DATA0 = data;while((R_UART_PEND0 & 0x2)==0);R_UART_PEND0 |= 1;
}#define TF_CARD_LOG_BUFFER_SIZE     (64*1024ul)
uint8_t tfCardLogBuffer[TF_CARD_LOG_BUFFER_SIZE] = {0};
uint32_t tfCardLogBufferIndex = 0;void TFCardLogBufferPut(uint8_t data) {tfCardLogBuffer[tfCardLogBufferIndex] = data;tfCardLogBufferIndex = (tfCardLogBufferIndex>=(sizeof(tfCardLogBuffer)/sizeof(tfCardLogBuffer[0]))-1) ? 0 : tfCardLogBufferIndex+1;
}

运行后日志是这样的:

# 正常运行 的日志
ab12c ...# 无法启动 的日志
ab1

.
.
.
后面我就猜想了很多:

  • 这个soc不能支持这么大的数值 64KB
  • 这个位置的内存被改写了
  • 和冷启动热启动有关
  • 芯片异常

.
.
.

后面我猜想,试试把TFCardLogBufferPut函数里面的tfCardLogBufferIndex的数值和data数值输出出来看看。
.
.

这一看不得了,越界了!

代码:
代码

输出日志:

ab1z31m00327300

.
.
.

这个tfCardLogBufferIndex越界了啊!而且初始化赋0并没有成功!这就非常坑爹了!
.
.
.
后面尝试在调用这个函数之前再次赋0,发现程序运行正常,设备也正常启动。

查看map文件这个数组和变量也是存放在BSS段的,这就非常令人费解了。
.
.
.
.
.
看到这里我直接就怀疑,就是这个芯片的锅。

但是别急这还不是让人最震惊的!后面还有让人更加鼻血飙升的。
.
.
.
.
.
.
.
.
.
.
.
.
.

最后找FAE排查问题很久,最后发现BSS段在hal_sysInit函数内初始化。

看代码:

void ax32xx_sysInit(u32 *saddr,u32 *eaddr)
{debg("sys init\n");			// 这个debg会调用 hal_uartSendData 函数输出日志//...ax32xx_wdtClear();//-----cache setax32xx_sysIcacheInit();ax32xx_sysDcacheInit();	
//-----bss clearax32xx_sysBSSClear();// ...
}

.
.
.

实在是震惊,无法理解这个RAM的初始化为什么放在main函数里面,实在无法理解进入main函数了,c语言环境都没有OK。

最烦的就是这种xx芯片,总是会有一些让人血压飙升的操作。

.
.
.
.
.

教训

在对数组进行访问的时候一定要先检查范围。

// 原函数
void TFCardLogBufferPut(uint8_t data) {tfCardLogBuffer[tfCardLogBufferIndex] = data;tfCardLogBufferIndex = (tfCardLogBufferIndex>=(sizeof(tfCardLogBuffer)/sizeof(tfCardLogBuffer[0]))-1) ? 0 : tfCardLogBufferIndex+1;
}// 改后
void TFCardLogBufferPut(uint8_t data) {if( tfCardLogBufferIndex>=(sizeof(tfCardLogBuffer)/sizeof(tfCardLogBuffer[0]))-1 ) {tfCardLogBufferIndex = 0;}tfCardLogBuffer[tfCardLogBufferIndex] = data;tfCardLogBufferIndex++;
}

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

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

相关文章

Arcgis中像元值变化问题,拉伸显示的是否为实际像元值范围?

Arcgis中合并栅格但像元值变化 问题描述 这是四幅栅格,范围都在-1-9之间,怀疑这个范围是否是真实的范围。因为经常听到同学说放到arcgis拉伸显示之后,值变化了,所以研究一下。 原因 可以打开ENVI的像元快速统计工具&#xff…

基于GRU的 电影评论情感分析 - python 深度学习 情感分类 计算机竞赛

文章目录 1 前言1.1 项目介绍 2 情感分类介绍3 数据集4 实现4.1 数据预处理4.2 构建网络4.3 训练模型4.4 模型评估4.5 模型预测 5 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 基于GRU的 电影评论情感分析 该项目较为新颖,适合作为竞…

大托,如何站上天心南部的价值高地?

作者 | 魏启扬 陈宇航 来源 | 洞见新研社 陈飞 摄 “商贾云集于四方,市井数盈于万户”,长沙南城古往今来生生不息的热辣与烟火,每隔一段时间,都会有璀璨的迸发。 才在“加长版”黄金周释放了“不夜南城”的魅力,第…

2023年浙大MEM考前80天上岸经验分享

时间过得真快,转眼间已经是十月份了。回想起去年这个时候,我还在为考研而感到焦虑不安。然而,如今我已经在浙大MEM项目学习了一个多月的时间了。在这一个月的学习过程中,我不仅学到了许多专业知识,还结识了很多志同道合…

小白学java--垃圾回收机制(Garbage Collection)

压测过程中,作为测试会时不时听到研发说命中gc了,如果一头雾水,来看看什么是gc。 1、什么是垃圾回收机制 垃圾回收的执行过程会导致一些额外的开销,例如扫描和标记对象、回收内存空间等操作。这些开销可能会导致一定的性能损失和…

QT计时器

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> //计时器类 #include <QTime> //时间类 QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widg…

microcom串口调试工具使用

microcom串口助手使用介绍 microcom是一个在终端中使用的串口助手&#xff0c;类似平常使用SSCOM一样的东西&#xff0c;不过是在终端中使用而已。 使用的是busybox构建的文件系统 microcom源码路径&#xff1a;busybox/miscutils/microcom.c microcom 参数&#xff1a; [r…

编程题总结 --- 2018

&#xff08;1&#xff09;输入一串字符串&#xff0c;字符串以“#”结尾&#xff0c;判断输入的字符串中0至9的个数。 #include<iostream>using namespace std;int main(){int sum 0;string s;while(cin >> s){if(s "#") break;int n s.size();for(…

代码随想录算法训练营第二十八天 | LeetCode 491. 递增子序列、46. 全排列、47. 全排列 II

代码随想录算法训练营第二十八天 | LeetCode 491. 递增子序列、46. 全排列、47. 全排列 II 文章链接&#xff1a;递增子序列 全排列 全排列II 视频链接&#xff1a;递增子序列 全排列 全排列II 目录 代码随想录算法训练营第二十八天 | LeetCode 4…

ArrayDeque 源码解析(JDK1.8)

目录 一. 前言 二. 源码解析 2.1. 概览 2.2. 属性 2.3. 构造方法 2.4. 入队 2.4.1. addFirst(E, e) 2.4.2. add(E e) & addLast(E e) 2.4.3. offer(E e) 2.5. 扩容 2.6. 出队 2.6.1. poll() & pollFirst() 2.6.2. pollLast() 2.7. 删除元素 2.8. 获取元…

【学习笔记】RabbitMQ01:基础概念认识以及快速部署

参考资料 RabbitMQ官方网站RabbitMQ官方文档噼咔噼咔-动力节点教程 文章目录 一、认识RabbitMQ1.1 消息中间件&#xff08;MQ Message Queue 消息队列1.2 主流的消息中间件1.3 MQ的应用场景1.3.1 异步处理1.3.2 系统解耦1.3.3 流量削峰1.3.4 日志处理 二、RabbitMQ运行环境搭建…

驱动开发day2

任务&#xff1a;使用模块化编译安装驱动实现三盏LED灯的亮灭 驱动程序 #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/io.h>#define PHY_RCC 0X50000A28 #define PH…

神经网络中的反向传播:综合指南

塔曼纳 一、说明 反向传播是人工神经网络 &#xff08;ANN&#xff09; 中用于训练深度学习模型的流行算法。它是一种监督学习技术&#xff0c;用于调整网络中神经元的权重&#xff0c;以最小化预测输出和实际输出之间的误差。 在神经网络中&#xff0c;反向传播是计算损失函数…

基于 Qt UDP通信局域网通信

前言 该例程经过实际验证可以正常使用,只简单的使用UDP中的单播模式(一对一), 所用测试系统在同一局域网,其中: QT版本:5.12 PC端UDP模式:单播 UDP通信目标:基于STM32F4+LWIP协议的以太网接口 调试助手: 虚拟串口+串口助手+UDP和TCP调试助手[编程人员必备]一、UDP通…

MySQL数据库下载与安装使用

文章目录 MySQL数据库下面是各个版本完整的生命周期。下载MySQL安装包安装和使用MySQL一些基础MySQL使用命令 MySQL数据库 这里我选择的是免安装绿色解压版本 现在各位开发者使用的MySQL&#xff0c;大部分版本都是 5.7&#xff0c;根据官方说明&#xff0c;MySQL 5.7 将于 202…

18.项目开发之前端项目搭建测试

项目开发之前端项目搭建测试 解压文件&#xff0c;将前端项目目录&#xff0c;拖拽到HBuilder中 前端项目QuantTrade_vue地址&#xff1a;传送门 后端项目QuantTrade地址&#xff1a; https://pan.baidu.com/s/1GF45B0QepApH8JbRIOLY7w?pwd1016 开启idea的项目&#xff0c;先…

智慧油气田方案:视频+AI识别,助力油气田生产与管理智能化转型

一、背景与挑战 根据《“十四五”能源领域科技创新规划》指出&#xff0c;要推动核心技术创新突破&#xff0c;推动煤炭、油田、电厂、电网等传统行业与数字化、智能化技术深度融合。我国油田产业已经摆脱了早期粗放式增长的阶段&#xff0c;需要更加精细化、智慧化、科学化的…

PyQt学习笔记-获取Hash值的小工具

目录 一、概述1.1 版本信息&#xff1a;1.2 基本信息&#xff1a;1.2.1 软件支持的内容&#xff1a;1.2.2 支持的编码格式 1.3 软件界面图 二、代码实现2.1 View2.2 Controller2.3 Model 三、测试示例 一、概述 本工具居于hashlibPyQtQFileDialog写的小工具&#xff0c;主要是…

django建站过程(2)创建第一个应用程序页面

创建第一个应用程序页面 设置第一个页面【settings.py,urls.py,views.py】settings.pyurls.pyviews.py django是由一系列应用程序组成&#xff0c;协同工作&#xff0c;让项目成为一个整体。前面已创建了一个应用程序baseapp,使用的命令 python manage.py startapp baseapps这…

机器学习,神经网络中,自注意力跟卷积神经网络之间有什么样的差异或者关联?

如图 6.38a 所示&#xff0c;如果用自注意力来处理一张图像&#xff0c;假设红色框内的“1”是要考虑的像素&#xff0c;它会产生查询&#xff0c;其他像素产生 图 6.37 使用自注意力处理图像 键。在做内积的时候&#xff0c;考虑的不是一个小的范围&#xff0c;而是整张图像的…