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

Keil MDK环境下FreeModebus移植踩坑记录

Keil MDK环境下FreeModebus移植踩坑记录

文章目录

  • Keil MDK环境下FreeModebus移植踩坑记录
    • armcc (arm compiler v5)环境
      • 实验一:
      • 实验二:
    • armclang (arm compiler v6)环境
      • 实验一:
      • 实验二:
      • 实验三:
      • 实验四
    • 总结

armcc (arm compiler v5)环境

实验一:

不勾选使用微库,不实现printf重定向。
在程序未接收到数据时可以正常运行,一接收到下发的数据便会停止运行,卡在如下图所示的BKPT 0xAB
在这里插入图片描述

实验二:

不勾选使用微库,关闭半主机模式,添加如下重定向代码:

#include <stdio.h>
//#include <time.h>
//#include <rt_misc.h>
#include "usart.h"#if !defined(__MICROLIB)
#pragma import(__use_no_semihosting)
void _sys_exit(int x) //避免使用半主机模式
{x = x;
}
void _ttywrch(int ch) {//sendchar (ch);ch = ch;
}
struct __FILE
{int handle;
};
FILE __stdout;
#endif#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif 
PUTCHAR_PROTOTYPE
{/* 实现串口发送一个字节数据的函数 *///serial_write(&serial1, (uint8_t)ch); //发送一个自己的数据到串口huart1.Instance->DR = ch & 0xff;return ch;
}

程序可以正常运行。

armclang (arm compiler v6)环境

实验一:

和上面实验一完全一致。

实验二:

不勾选使用微库,关闭半主机模式

__asm (".global __use_no_semihosting\n\t");
void _sys_exit(int x) //避免使用半主机模式
{x = x;
}
void _ttywrch(int ch) {//sendchar (ch);ch = ch;
}

程序中添加上如上代码,程序会卡死在hardfault中断中,在串口接收中断中设置断点,发现是由assert()函数位置处跳进了hardfault中断中。

实验三:

勾选上使用微库,其它不动,编译会有如下报错:
在这里插入图片描述
上面的第一个报错和第三个报错可以通过https://blog.csdn.net/qq_62014938/article/details/125602277文章中介绍的办法解决掉,然后只剩如下一个错误:
在这里插入图片描述
对于__eabi_assert未定义错误我们可以参考如下连接中的解释:ARMCLANG: L6218E: Undefined Symbol __aeabi_assert。文中说明了原因:我们勾选了使用微库,而微库不支持abort(),exit(),assert()等函数。FreeModbus库中用到了assert函数,因而导致了该问题。文章中也给除了多种解决方法:

  1. 在RTE环境下添加STDERR组件
  2. 使用微库自己实现__eabi_assert()函数
  3. 关闭assert函数:在C/C++配置页中的全局宏定义位置添加NDEBUG的宏,这可以让assert()函数无效
  4. 关闭使用微库
    在测试方法1的时候程序总会卡死在retarget_io.c文件中的abort()函数位置处。如下所示:
    在这里插入图片描述

方法2未测试。方法3可以有效解决该问题。

实验四

不使用微库,不配置RTE,只在C/C++配置处添加NDEBUG宏,如下所示:
在这里插入图片描述
程序可以正常运行。

总结

出现上面问题的主要原因在于FreeModbus库中使用了assert函数导致的,这里比较好的办法还是通过添加NDEBUG宏使assert()函数失效。

相关文章:

Keil MDK环境下FreeModebus移植踩坑记录

Keil MDK环境下FreeModebus移植踩坑记录 文章目录 Keil MDK环境下FreeModebus移植踩坑记录armcc (arm compiler v5)环境实验一&#xff1a;实验二&#xff1a; armclang (arm compiler v6)环境实验一&#xff1a;实验二&#xff1a;实验三&#xff1a;实验四 总结 armcc (arm c…...

计算机视觉的延伸整理

计算机视觉是一门涉及数字图像处理、模式识别和机器学习等技术的交叉学科&#xff0c;旨在将计算机技术应用于对视觉信息的理解和处理。其主要研究内容包括图像和视频处理、目标检测和跟踪、三维重建、人脸识别、自动驾驶等。计算机视觉已经被广泛应用于医学影像分析、安防监控…...

通过Idea部署Tomcat服务器(详细图文教学)

1.在idea中创建项目 有maven构建工具就创建maven&#xff0c;没有就正常创建一个普通的java程序 创建普通java项目 2.添加框架 3.配置 Tomcat 注意&#xff1a;创建web项目后我们需要配置tomcat才能运行&#xff0c;下面我们来进行配置。 4.添加部署 回到服务器 5.完善配置 6…...

Window版本ES(ElasticSearch)的安装,使用,启动

首先我这里是根据小破站狂神说up主&#xff0c;而学习的&#xff0c;下面是笔记文档&#xff0c;文档可能比我更细&#xff0c;但我还是记录一下&#xff0c;嘿嘿嘿 ElasticSearch7.6入门学习笔记-KuangStudy-文章 下面直接开始&#xff0c;首先我们需要下载ELK三个安装包&…...

网络面试题-UDPTCP

1 UDP 1.1 ⾯向报⽂ UDP 是⼀个⾯向报⽂&#xff08;报⽂可以理解为⼀段段的数据&#xff09;的协议。意思就是UDP 只是报⽂的搬运⼯&#xff0c;不会对报⽂进⾏任何拆分和拼接操作 具体来说 在发送端&#xff0c;应⽤层将数据传递给传输层的 UDP 协议&#xff0c; UDP 只会…...

在CSDN学Golang场景化解决方案(即时通讯goim)

一&#xff0c;支持单个、多个、广播消息推送 在goim中&#xff0c;用户可以通过维护长连接实现即时通讯功能&#xff0c;通过路由算法将消息发送给指定的客户端或群组。具体而言&#xff0c;goim支持以下三种方式进行消息推送&#xff1a; 单个推送&#xff1a;向某一个指定客…...

chrome插件开发实例02-使用content_scripts对用户浏览页面操作

目录 引言 chrome插件 插件演示 源代码 manifest.json content_scripts.js css设置(放在css文件夹下)<...

【Python目标识别】Labelimg标记深度学习(YOLO)样本

人工智能、ai、深度学习已经火了很长一段时间了&#xff0c;但是还有很多小伙伴没有接触到这个行业&#xff0c;但大家应该多多少少听过&#xff0c;网上有些兼职就是拿电脑拉拉框、数据标注啥的&#xff0c;其实这就是在标记样本&#xff0c;供计算机去学习。所以今天跟大家分…...

【雕爷学编程】MicroPython动手做(30)——物联网之Blynk 3

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…...

C高级--day3(shell中的输入、命令置换符、数组、算数运算、分支结构)

#!/bin/bash pls ~/ -l | grep "^-" | wc -l qls ~/ -l | grep "^d" | wc -l echo "普通文件个数&#xff1a;$p" echo "目录文件个数&#xff1a;$q"#!/bin/bash read file posexpr index $file \. strexpr substr $file $((pos1)) 2…...

安防监控国标GB28181平台EasyGBS视频快照无法显示是什么原因?如何解决?

安防视频监控国标视频云服务EasyGBS支持设备/平台通过国标GB28181协议注册接入&#xff0c;并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强&#xff0c;支持将接入的视频流进行全终端、全平台分发&#xff…...

route命令 路由表 Linux Centos

route route命令在Linux中被用于显示和操纵IP路由表。然而&#xff0c;现在大部分Linux发行版都推荐使用ip route命令代替route&#xff0c;因为ip route提供更多的功能和更灵活的控制。 以下是route命令的基本用法&#xff1a; 查看路由表: route -n 这个命令显示当前机器的路…...

CMMI评审

CMMI评审 对于刚入行的朋友来说,可能对CMMI比较陌生。但对于工作多年的朋友来说,有可能都会接触过CMMI。那CMMI到底是什么? CMMI的全称为Capability Maturity Model Integration,即能力成熟度模型集成。对于软件行业,一般是指软件能力成熟度模型集成,是由美国国防部与卡内…...

深入了解 PostgreSQL 扩展插件

深入了解 PostgreSQL 扩展插件 在 PostgreSQL 数据库中&#xff0c;扩展插件是极具价值的工具&#xff0c;它们为我们提供了丰富多样的功能增强。本篇博客将深入介绍几个常用的 PostgreSQL 扩展插件&#xff0c;包括 pg_stat_statements、uuid、postgis 以及 postgis_raster。…...

记一次kernel patch(附开源贡献相关)

文章目录 开源操作系统流程手记smatch能发现的典型问题常见的修复方案附&#xff1a;偶然发现&#xff0c;unlikely函数搞开源贡献的一些捷径 开源操作系统 看了zhihu上的一些科普&#xff0c;明白二次开发是常见现象&#xff0c;套壳、抄袭、自研都不是很科学的说法。中外大厂…...

Pytorch Tutorial【Chapter 1. Basic operation of tensor】

Pytorch Tutorial 文章目录 Pytorch TutorialChapter 1. Basic operation of tensorReference Chapter 1. Basic operation of tensor 本节介绍有关张量Tensor的基本操作 Tensor相当于numpy中的ndarrays 创建空Tensor和全零Tensor&#xff0c;torch.zeros(d0,d1)类似于numpy…...

[环境配置]centos7安装vncserver

1. 首先&#xff0c;需要安装X Window System和GNOME桌面环境。可以通过以下命令进行安装&#xff1a; yum groupinstall "X Window System" yum groupinstall "GNOME Desktop" 2. 安装VNC服务器。可以通过以下命令进行安装&#xff1a; yum install ti…...

Excel功能总结

1&#xff09;每一张表格上都打印表头 “页面布局”-->“打印标题”-->页面设置“工作表”页-->打印标题“顶端标题行” 如&#xff1a;固定第1~2行&#xff0c;设置成“$1:$2” 2&#xff09;将页面内容打印在一页【缩印】 1.选好需要打印的区域&#xff0c;“页面布…...

用Rust实现23种设计模式之 组合模式

组合模式是一种结构型设计模式&#xff0c;它允许将对象组合成树状结构&#xff0c;并且能够以统一的方式处理单个对象和组合对象。以下是组合模式的优点和使用场景&#xff1a; 优点&#xff1a; 简化客户端代码&#xff1a;组合模式通过统一的方式处理单个对象和组合对象&a…...

opencv36-形态学操作-膨胀 cv2.dilate()

膨胀操作是形态学中另外一种基本的操作。膨胀操作和腐蚀操作的作用是相反的&#xff0c;膨胀操作能对图像的边界进行扩张。膨胀操作将与当前对象&#xff08;前景&#xff09;接触到的背景点合并到当前对象内&#xff0c;从而实现将图像的边界点向外扩张。如果图像内两个对象的…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...