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

BUG——imx6u开发_结构体导致的死机问题(未解决)

简介:

        最近在做imx6u的linux下裸机驱动开发,由于是学习的初级阶段,既没有现成的IDE可以使用,也没有GDB等在线调试工具,只能把代码烧写在SD卡上再反复插拔,仅靠卑微的亮灯来判断程序在哪一步。

        至于没有使用串口的原因是,我现在就是卡在了这个串口的开发上。我的感受和这位老兄大抵是相同的

问题为:对下面结构体局部变量的定义前面加上volatile关键字,结果程序运行到这步时,直接卡死。理论上,并不应该会出现这种情况

typedef struct{uint8_t HYS;   // 迟滞uint8_t PULL;  // 上拉/下拉uint8_t ODE;   // 开漏uint8_t SPEED; // 速度uint8_t DSE;   // 驱动强度uint8_t SRE;   // 转换速率uint8_t SION; // 软件输入             } MyStruct;/*------------在某个函数内部---------------*///定义一个局部变量时会卡死
volatile MyStruct my2 = {0};

尝试

        对此,我做了一些尝试,但仍未能找到根本原因:

1,猜测是成员变量导致的问题

        于是,我对成员变量的类型做了一些改变,发现,只要不都是uint8_t或者char类型就不会卡死

typedef struct{uint16_t HYS;   // 迟滞uint8_t PULL;  // 上拉/下拉uint8_t ODE;   // 开漏uint8_t SPEED; // 速度uint8_t DSE;   // 驱动强度uint8_t SRE;   // 转换速率uint8_t SION; // 软件输入             } MyStruct;typedef struct{uint8_t HYS;   // 迟滞uint8_t PULL;  // 上拉/下拉uint8_t ODE;   // 开漏uint8_t SPEED; // 速度uint8_t DSE;   // 驱动强度uint8_t SRE;   // 转换速率uint32_t SION; // 软件输入             } MyStruct;

        同时,对成员变量的数量做了一些改变,只要不是7个uint8_t或char类型,就不会卡死

typedef struct
{uint16_t HYS ;   // 迟滞uint16_t PULL ;  // 上拉/下拉uint16_t ODE ;   // 开漏uint16_t SPEED ; // 速度uint16_t DSE ;   // 驱动强度uint16_t SRE ;   // 转换速率uint16_t SION ;  // 软件输入} MyStruct;typedef struct{uint8_t HYS;   // 迟滞uint8_t PULL;  // 上拉/下拉uint8_t ODE;   // 开漏uint8_t SPEED; // 速度uint8_t DSE;   // 驱动强度uint8_t SRE;   // 转换速率uint8_t SION; // 软件输入   uint8_t SIO; // 软件输入             } MyStruct;

        此外,改变了结构体名也仍会出现上面问题

2,怀疑是优化级别导致的问题

        由于我默认开的是-O2级别优化,为此,对上述代码进行了-Og、-O0、-O1、-O2、-O3优化(没少被-O2坑过),结果仍会出现相同的问题。此外也怀疑过是堆栈溢出,但是栈大小足足设置了2MB,并且通过增加不优化的无关变量数组排除掉了这个可能。 

 3,怀疑是变量定义导致的

        于是尝试了下面几种形式,只要最后一种会出现这种问题。奇怪的是第三种竟然没出现问题(这可能是个伏笔)

   MyStruct my1;MyStruct my1 = {0};volatile MyStruct my1;volatile MyStruct my1 = {0};

4,怀疑是内存排列导致的问题(最有可能)

         对此,使用了__attribute__((aligned(4/6/8/16/32)));进行测试,仍然不能解决问题,改变了成员变量排列顺序(像是无用功)仍未解决

        后来使用了位域来测试,如果是uint32_t、uint16_t等组成的位域,哪怕都是8位位宽也不会出现问题。如果是7个uint8_t类型,倘若位宽不尽相同的话,那么也可能不会出现问题。

typedef struct
{uint16_t HYS : 8;   // 迟滞uint16_t PULL : 8;  // 上拉/下拉uint16_t ODE : 8;   // 开漏uint16_t SPEED : 8; // 速度uint16_t DSE : 8;   // 驱动强度uint16_t SRE : 8;   // 转换速率uint16_t SION : 8;  // 软件输入} MyStruct;typedef struct
{uint8_t HYS : 5;   // 迟滞uint8_t PULL : 5;  // 上拉/下拉uint8_t ODE : 5;   // 开漏uint8_t SPEED : 5; // 速度uint8_t DSE : 5;   // 驱动强度uint8_t SRE : 5;   // 转换速率uint8_t SION : 5;  // 软件输入} MyStruct1;typedef struct
{uint8_t HYS : 8;   // 迟滞uint8_t PULL : 8;  // 上拉/下拉uint8_t ODE : 8;   // 开漏uint8_t SPEED : 8; // 速度uint8_t DSE : 8;   // 驱动强度uint8_t SRE : 8;   // 转换速率uint8_t SION : 8;  // 软件输入} MyStruct2;

       进一步测试中发现,在选用7个uint8_t的情况下,如果位宽都为1、2、3、4就不会出现问题,如果是其余数字(包括8)就会出现问题。也就是说位宽都低于4(包括4),就不会发生问题。

        更进一步测试,如果7个uint8_t成员里,有至少两个位宽低于4(包括4),并且它们可以不连续排列,那么也不会发生问题

        由此观之,很大程度上与结构体在内存中的排列有关,这现象着实诡异,也可能与imx6u这块板有关,总之原因暂时不明

typedef struct
{uint8_t HYS : 1;   // 迟滞uint8_t PULL : 1;  // 上拉/下拉uint8_t ODE : 1;   // 开漏uint8_t SPEED : 1; // 速度uint8_t DSE : 1;   // 驱动强度uint8_t SRE : 1;   // 转换速率uint8_t SION : 1;  // 软件输入} MyStruct;typedef struct
{uint8_t HYS : 2;   // 迟滞uint8_t PULL : 2;  // 上拉/下拉uint8_t ODE : 2;   // 开漏uint8_t SPEED : 2; // 速度uint8_t DSE : 2;   // 驱动强度uint8_t SRE : 2;   // 转换速率uint8_t SION : 2;  // 软件输入} MyStruct1;typedef struct
{uint8_t HYS : 6;   // 迟滞uint8_t PULL : 6;  // 上拉/下拉uint8_t ODE : 6;   // 开漏uint8_t SPEED : 6; // 速度uint8_t DSE : 6;   // 驱动强度uint8_t SRE : 6;   // 转换速率uint8_t SION : 6;  // 软件输入} MyStruct2;

点灯调试:

    /*初始化串口IO*/volatile MyStruct my1 = {0};_Debug_LED;//卑微点灯宏volatile MyStruct1 my2 = {0};_Debug_LED;volatile MyStruct2 my3 = {0};_Debug_LED;volatile IOMUXC_ConfigTypeDef uart_config = {0}; // 卡死在这里,与结构体有关_Debug_LED;

相关文章:

BUG——imx6u开发_结构体导致的死机问题(未解决)

简介: 最近在做imx6u的linux下裸机驱动开发,由于是学习的初级阶段,既没有现成的IDE可以使用,也没有GDB等在线调试工具,只能把代码烧写在SD卡上再反复插拔,仅靠卑微的亮灯来判断程序死在哪一步。 至于没有使…...

问答:什么是对称密钥、非对称密钥,http怎样变成https的?

文章目录 对称密钥 vs 非对称密钥HTTP 变成 HTTPS 的过程 对称密钥 vs 非对称密钥 1. 对称密钥加密 定义: 对称密钥加密是一种加密算法,其中加密和解密使用的是同一个密钥。特点: 速度快: 因为只使用一个密钥,所以加密和解密速度较快。密钥分发问题: 双…...

虚拟滚动列表组件ReVirtualList

虚拟滚动列表组件ReVirtualList 组件实现基于 Vue3 Element Plus Typescript,同时引用 vueUse lodash-es tailwindCss (不影响功能,可忽略) 在 ReList 的基础上,增加虚拟列表功能,在固定高度的基础上,可以优化大数…...

稳定、耐用、美观 一探究竟六角头螺钉螺栓如何选择

在机器与技术未被发现的过去,紧固件设计和品质并不稳定。但是,他们已成为当今许多行业无处不在的构成部分。六角头标准件或六角头标准件是紧固件中持续的头部设计之一,它有六个面,对广泛工业应用大有益处。六角头标准件或常分成六…...

数据库Mybatis基础操作

目录 基础操作 删除 预编译SQL 增、改、查 自动封装 基础操作 环境准备 删除 根据主键动态删除数据:使用了mybatis中的参数占位符#{ },里面是传进去的参数。 单元测试: 另外,这个方法是有返回值的,返回这次操作…...

人物形象设计:塑造独特角色的指南

引言 人物形象设计是一种创意过程,它利用强大的设计工具,通过视觉和叙述元素塑造角色的外在特征和内在性格。这种设计不仅赋予角色以生命,还帮助观众或读者在心理层面上与角色建立联系。人物形象设计的重要性在于它能够增强故事的吸引力和说…...

网络安全-安全策略初认识

文章目录 前言理论介绍1. 安全策略1.1 定义:1.2 关键术语: 2. 防火墙状态监测 实战步骤1:实验环境搭建步骤2:配置实现 总结1. 默认安全策略2. 自定义安全策略3. 防火墙状态会话表 前言 who:本文主要写给入门防火墙的技…...

python import相对导入与绝对导入

文章目录 相对导入与绝对导入绝对导入相对导入何时使用相对导入何时使用绝对导入示例 相对导入与绝对导入 在Python中,from .file_manager import SomeFunction 和 from file_manager import SomeFunction 两种导入方式看似相似,但在模块寻找机制上存在…...

深入理解 Go 语言原子内存操作

原子内存操作提供了实现其他同步原语所需的低级基础。一般来说,你可以用互斥体和通道替换并发算法的所有原子操作。然而,它们是有趣且有时令人困惑的结构,应该深入了解它们是如何工作的。如果你能够谨慎地使用它们,那么它们完全可以成为代码优化的好工具,而不会增加复杂性…...

PostgreSQL几个扩展可以帮助实现数据的分词和快速查询

在 PostgreSQL 数据库中,有几个扩展可以帮助实现数据的分词和快速查询,特别是在处理全文搜索和文本分析时。以下是几个常用的扩展: 1. pg_trgm pg_trgm(Trigram)扩展是 PostgreSQL 中的一个强大的工具,它可以通过计算字符串之间的相似度来实现快速文本搜索。它支持基于…...

C盘满了怎么办?教你清理C盘的20个大招,值得收藏备用

C盘满了怎么办?教你清理C盘的20个大招,值得收藏备用 今天给大家介绍20种C盘清理的方法,下次遇到C盘满了红了就知道怎么做了,喜欢请点赞收藏关注点评。 清理更新缓存 清理微信缓存 查找大文件清理或者迁移 磁盘缓存清理 系统还…...

原生js实现下滑到当前模块进度条填充

<div style"height: 1500px;"></div> <div class"progress-container"><div class"progress-bar" data-progress"90%"><p class"progress-text">Google Ads在Google搜索引擎上覆盖超过90%的互…...

显示弹出式窗口的方法

文章目录 1. 概念介绍2. 使用方法3. 示例代码 我们在上一章回中介绍了Sliver综合示例相关的内容&#xff0c;本章回中将介绍PopupMenuButton组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中介绍的PopupMenuButton组件位于AppBar右侧&#xf…...

Java-什么是缓存线程池?

什么是缓存线程池? 缓存线程池 (CachedThreadPool) 是一种特殊的线程池,它能够动态地调整线程的数量,以适应任 务的需求。这种线程池非常适合处理大量短暂的任务,因为它会根据任务的数量自动增加或减少线 程的数量。 缓存线程池的特点: 线程数量动态调整:缓存线程池…...

esbuild中的Binary Loader:处理二进制文件

在前端或Node.js项目中&#xff0c;有时需要处理二进制文件&#xff0c;如图片、音频、视频或其他非文本资源。esbuild提供了一款名为Binary Loader的插件&#xff0c;它能够在构建时将二进制文件加载为二进制缓冲区&#xff0c;并使用Base64编码将其嵌入到打包文件中。在运行时…...

深度好文:从《黑神话:悟空》看未来游戏趋势:高互动性、个性化与全球化

引言 在数字时代的浪潮中&#xff0c;游戏产业以其独特的魅力和无限的可能性&#xff0c;成为了全球娱乐文化的重要组成部分。随着科技的飞速发展&#xff0c;特别是高性能计算和人工智能技术的突破&#xff0c;游戏的世界变得越来越真实、细腻且富有深度。而在这股技术洪流中…...

【中项第三版】系统集成项目管理工程师 | 第 12 章 执行过程组

前言 本章属于10大管理的内容&#xff0c;上午题预计会考8-10分&#xff0c;下午案例分析也会进行考查。学习要以教材为主。 目录 12.1 指导与管理项目工作 12.1.1 主要输入 12.1.2 主要输出 12.2 管理项目知识 12.2.1 主要输入 12.2.2 主要输出 12.3 管理质量 12.3.…...

C语言自动生成宏定义枚举类型和字符串

#include <stdio.h>// 定义错误枚举 #define ERROR_LIST(e) \e(SUCCESS) \e(FAILURE) \e(NOT_FOUND) \e(TIMEOUT)// 使用宏生成枚举 #define GENERATE_ENUM(ENUM) ENUM, typedef enum {ERROR_LIST(GENERATE_ENUM) } ErrorCode;// 使用宏生成字符串数组…...

C#单例模式

&#xfeff;using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace _3._3._6_单例模式 {public class Singleton{private static Singleton s_instance;private int _state;private Singleton(int …...

10-使用sentinel流控

本文介绍sentinel的直接流控的使用。 0、环境 jdk 1.8sentinel 1.8.2springboot 2.4.2 1、sentinel环境搭建 从官方发布的网站上下载: sentinel Jar&#xff0c;下载对应版本。 下载完成后&#xff0c;进入刚才下载的Jar文件所在的目录&#xff0c;执行如下命令&#xff1a…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...