当前位置: 首页 > 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…...

redis AOF机制

在redis运行期间&#xff0c;不断将redis执行的写命令写到文件中&#xff0c;redis重启之后&#xff0c;只要将这些命令重复执行一遍就可以恢复数据。因为AOF只是将少量的写命令写入AOF文件中&#xff0c;因此其执行效率高于RDB&#xff0c;开启AOF即使Redis发生故障&#xff0…...

Day 21代码|随想录| 二叉树完结撒花,今日刷题669.修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.吧二叉搜索树转换为累加树

提示&#xff1a;DDU&#xff0c;供自己复习使用。欢迎大家前来讨论~ 文章目录 二叉树 Part06二、题目题目一&#xff1a;669.修剪二叉搜索树解题思路&#xff1a;递归法迭代法&#xff1a; 题目二&#xff1a; 108.将有序数组转换为二叉搜索树解题思路递归法&#xff1a;迭代…...

cmake教程一

1. Start 1.1 构建简单工程 cmake_minimum_required(VERSION 3.0) project(Step1) add_executable(Step1 main.cpp)设置cmake最低版本要求设置工程名字设置工程生成可执行程序 2. 声明 C Standard set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True)如果我…...

3D场景标注标签信息,three.js CSS 2D渲染器CSS2DRenderer、CSS 3D渲染器CSS3DRenderer(结合react)

如果你想用HTML元素作为标签标注三维场景中模型信息&#xff0c;需要考虑定位的问题。比如一个模型&#xff0c;在代码中你可以知道它的局部坐标或世界坐标xyz&#xff0c;但是你并不知道渲染后在canvas画布上位置&#xff0c;距离web页面顶部top和左侧的像素px值。自己写代码把…...

C++参悟-单例模式

单例模式 一、概述1. 特点2. 实现方式3. 应用场景 二、实现代码1. 静态局部变量的懒汉单例2. 加锁的懒汉式单例3. 使用 C11 中的 std::call_one 的懒汉单例4. 饿汉式单例 一、概述 这里记录一下单例模式的最常用使用&#xff0c;单例模式&#xff08;Single Pattern&#xff0…...

【题解】—— LeetCode一周小结32

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结31 5.不含连续1的非负整数 题目链接&#xff1a;600. 不含连续…...

详解线索分层的目的、维度与创新实践

线索分层是一个系统性的过程&#xff0c;旨在更有效地管理、跟踪和利用线索资源。这一过程可以借鉴多种策略和方法&#xff0c;特别是在用户运营和市场营销中。 1、线索分层的目的 线索分层的主要目的是根据线索的不同特征或成熟度&#xff0c;将其分类管理&#xff0c;以便更…...

于8月21号的回顾

傍晚的日落和逐渐深邃的夜&#xff0c;驱散了白天的极致闷热。倦怠和疲惫充斥着大脑&#xff0c;喧嚣的浮沉又在耳边轰鸣。 我不曾想到&#xff0c;再次打开博客已经是两年后的今天了。手指轻轻滑过鼠标&#xff0c;博客的页面缓缓加载&#xff0c;那些被时间尘封的记忆瞬间涌…...

Abstract Class抽象类

抽象类&#xff08;Abstract Class&#xff09;在面向对象编程中是一种特殊的类&#xff0c;它不能被实例化&#xff0c;即不能创建该类的对象。抽象类主要用于定义一组接口&#xff08;即方法&#xff09;&#xff0c;这些方法的具体实现由子类来完成。抽象类通常用于表示一种…...

webrtc ns 降噪之粉红噪声参数推导

webrtc中降噪中&#xff0c;前50帧需要进行简单噪声估计&#xff0c;使用白噪声和粉红噪声模型估算。 首先我们 复习 有色噪声&#xff08;包含白噪声&#xff09;的一般模型&#xff1a; S(f) 是频率 f 处的功率谱密度。f是频率。α 是一个频谱指数&#xff0c;通常在1左右。…...

长春疫情最新消息今天封城了/外贸谷歌优化

之前客户给了一个域名检测api接口&#xff0c;专门对接程序的&#xff0c;用于程序自动检测域名轮转&#xff0c;拦截域名自动下线用的最近买域名比较频繁&#xff0c;总是入坑&#xff0c;一不小心买回来的新域名就是已经被微信拦截的&#xff0c;估计是域名上一任主人没有善待…...

网站建设基础教程视频/石家庄网站关键词推广

看看国外大牛如何在macos开发游戏 1999 年&#xff0c;我在斯图加特的 SAE 学院学习。作为一个主要的研究项目&#xff0c;我们必须使用Macromedia Director实施一个应用程序作为小组项目的一部分。我们决定以经典 Lucasart 游戏&#xff08;Maniac Mansion、Monkey Island&…...

城市旅游网站开发/友链

LiveCharts文档-3开始-8自定义工具提示 原文:LiveCharts文档-3开始-8自定义工具提示LiveCharts文档-3开始-8自定义工具提示 默认每个需要tooltip或者legend的chart都会初始化一个DefaultLengend和DefaultTooltip对象。 自定义默认 你可以用下面的类来自定义一小部分&#xff0c…...

生物商城网站建设/5月新冠病毒最新消息

https://chengkehan.github.io/Anisotropic.html 转载于:https://www.cnblogs.com/jim-game-dev/p/5744556.html...

武汉做网站公司/百度资源搜索

1. 变量message "Hello Python world!"print(message)添加一个名为 message 的变量 。每个变量都存储了一个值 —— 与变量相关联的信息。在这里&#xff0c;存储的值为文本“Hello Python world!”。添加一个变量 message1.1 变量的命名规则① 变量名只能包含字母、…...

网站已经收录了 但是输入公司名找不到/2024年重大新闻摘抄

打开链接 安装...