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函数,因而导致了该问题。文章中也给除了多种解决方法:
- 在RTE环境下添加STDERR组件
- 使用微库自己实现
__eabi_assert()
函数 - 关闭assert函数:在C/C++配置页中的全局宏定义位置添加
NDEBUG
的宏,这可以让assert()
函数无效 - 关闭使用微库
在测试方法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)环境实验一:实验二: armclang (arm compiler v6)环境实验一:实验二:实验三:实验四 总结 armcc (arm c…...
计算机视觉的延伸整理
计算机视觉是一门涉及数字图像处理、模式识别和机器学习等技术的交叉学科,旨在将计算机技术应用于对视觉信息的理解和处理。其主要研究内容包括图像和视频处理、目标检测和跟踪、三维重建、人脸识别、自动驾驶等。计算机视觉已经被广泛应用于医学影像分析、安防监控…...

通过Idea部署Tomcat服务器(详细图文教学)
1.在idea中创建项目 有maven构建工具就创建maven,没有就正常创建一个普通的java程序 创建普通java项目 2.添加框架 3.配置 Tomcat 注意:创建web项目后我们需要配置tomcat才能运行,下面我们来进行配置。 4.添加部署 回到服务器 5.完善配置 6…...

Window版本ES(ElasticSearch)的安装,使用,启动
首先我这里是根据小破站狂神说up主,而学习的,下面是笔记文档,文档可能比我更细,但我还是记录一下,嘿嘿嘿 ElasticSearch7.6入门学习笔记-KuangStudy-文章 下面直接开始,首先我们需要下载ELK三个安装包&…...
网络面试题-UDPTCP
1 UDP 1.1 ⾯向报⽂ UDP 是⼀个⾯向报⽂(报⽂可以理解为⼀段段的数据)的协议。意思就是UDP 只是报⽂的搬运⼯,不会对报⽂进⾏任何拆分和拼接操作 具体来说 在发送端,应⽤层将数据传递给传输层的 UDP 协议, UDP 只会…...
在CSDN学Golang场景化解决方案(即时通讯goim)
一,支持单个、多个、广播消息推送 在goim中,用户可以通过维护长连接实现即时通讯功能,通过路由算法将消息发送给指定的客户端或群组。具体而言,goim支持以下三种方式进行消息推送: 单个推送:向某一个指定客…...
chrome插件开发实例02-使用content_scripts对用户浏览页面操作
目录 引言 chrome插件 插件演示 源代码 manifest.json content_scripts.js css设置(放在css文件夹下)<...

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

【雕爷学编程】MicroPython动手做(30)——物联网之Blynk 3
知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…...

C高级--day3(shell中的输入、命令置换符、数组、算数运算、分支结构)
#!/bin/bash pls ~/ -l | grep "^-" | wc -l qls ~/ -l | grep "^d" | wc -l echo "普通文件个数:$p" echo "目录文件个数:$q"#!/bin/bash read file posexpr index $file \. strexpr substr $file $((pos1)) 2…...

安防监控国标GB28181平台EasyGBS视频快照无法显示是什么原因?如何解决?
安防视频监控国标视频云服务EasyGBS支持设备/平台通过国标GB28181协议注册接入,并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强,支持将接入的视频流进行全终端、全平台分发ÿ…...
route命令 路由表 Linux Centos
route route命令在Linux中被用于显示和操纵IP路由表。然而,现在大部分Linux发行版都推荐使用ip route命令代替route,因为ip route提供更多的功能和更灵活的控制。 以下是route命令的基本用法: 查看路由表: route -n 这个命令显示当前机器的路…...
CMMI评审
CMMI评审 对于刚入行的朋友来说,可能对CMMI比较陌生。但对于工作多年的朋友来说,有可能都会接触过CMMI。那CMMI到底是什么? CMMI的全称为Capability Maturity Model Integration,即能力成熟度模型集成。对于软件行业,一般是指软件能力成熟度模型集成,是由美国国防部与卡内…...

深入了解 PostgreSQL 扩展插件
深入了解 PostgreSQL 扩展插件 在 PostgreSQL 数据库中,扩展插件是极具价值的工具,它们为我们提供了丰富多样的功能增强。本篇博客将深入介绍几个常用的 PostgreSQL 扩展插件,包括 pg_stat_statements、uuid、postgis 以及 postgis_raster。…...
记一次kernel patch(附开源贡献相关)
文章目录 开源操作系统流程手记smatch能发现的典型问题常见的修复方案附:偶然发现,unlikely函数搞开源贡献的一些捷径 开源操作系统 看了zhihu上的一些科普,明白二次开发是常见现象,套壳、抄袭、自研都不是很科学的说法。中外大厂…...
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,torch.zeros(d0,d1)类似于numpy…...
[环境配置]centos7安装vncserver
1. 首先,需要安装X Window System和GNOME桌面环境。可以通过以下命令进行安装: yum groupinstall "X Window System" yum groupinstall "GNOME Desktop" 2. 安装VNC服务器。可以通过以下命令进行安装: yum install ti…...

Excel功能总结
1)每一张表格上都打印表头 “页面布局”-->“打印标题”-->页面设置“工作表”页-->打印标题“顶端标题行” 如:固定第1~2行,设置成“$1:$2” 2)将页面内容打印在一页【缩印】 1.选好需要打印的区域,“页面布…...
用Rust实现23种设计模式之 组合模式
组合模式是一种结构型设计模式,它允许将对象组合成树状结构,并且能够以统一的方式处理单个对象和组合对象。以下是组合模式的优点和使用场景: 优点: 简化客户端代码:组合模式通过统一的方式处理单个对象和组合对象&a…...

opencv36-形态学操作-膨胀 cv2.dilate()
膨胀操作是形态学中另外一种基本的操作。膨胀操作和腐蚀操作的作用是相反的,膨胀操作能对图像的边界进行扩张。膨胀操作将与当前对象(前景)接触到的背景点合并到当前对象内,从而实现将图像的边界点向外扩张。如果图像内两个对象的…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
flow_controllers
关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...

【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验
2024年初,人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目(一款融合大型语言模型能力的云端AI编程IDE)时,技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力,TRAE在WayToAGI等…...
Python第七周作业
Python第七周作业 文章目录 Python第七周作业 1.使用open以只读模式打开文件data.txt,并逐行打印内容 2.使用pathlib模块获取当前脚本的绝对路径,并创建logs目录(若不存在) 3.递归遍历目录data,输出所有.csv文件的路径…...

C++中vector类型的介绍和使用
文章目录 一、vector 类型的简介1.1 基本介绍1.2 常见用法示例1.3 常见成员函数简表 二、vector 数据的插入2.1 push_back() —— 在尾部插入一个元素2.2 emplace_back() —— 在尾部“就地”构造对象2.3 insert() —— 在任意位置插入一个或多个元素2.4 emplace() —— 在任意…...
使用 uv 工具快速部署并管理 vLLM 推理环境
uv:现代 Python 项目管理的高效助手 uv:Rust 驱动的 Python 包管理新时代 在部署大语言模型(LLM)推理服务时,vLLM 是一个备受关注的方案,具备高吞吐、低延迟和对 OpenAI API 的良好兼容性。为了提高部署效…...