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

news2024/9/29 3:32:45

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()函数失效。

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

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

相关文章

TCP Socket 基础知识点(实例是以Java进行演示)

本篇根据TCP & Socket 相关知识点和学习所得进行整理所得。 文章目录 前言1. TCP相关知识点1.1 双工/单工1.2 TCP协议的主要特点1.3 TCP的可靠性原理1.4 报文段1.4.1 端口1.4.2 seq序号1.4.3 ack确认号1.4.4 数据偏移1.4.5 保留1.4.6 控制位1.4.7 窗口1.4.8 校验和1.4.9 紧…

Qt事件的传递顺序

事件的传递顺序 事件的传递顺序是这样的&#xff1a;先是事件过滤器&#xff0c;然后是该部件的event()函数&#xff0c;最后是该部件的事件处理函数。这里还要注意&#xff0c;event()函数和事件处理函数&#xff0c;是在该部件内进行重新定义的&#xff0c;而事件过滤器却是…

Kali部署dvwa和pikachu靶场

kali换源 进入 vim /etc/apt/sources.list deb https://mirrors.aliyun.com/kali kali-rolling main non-free contrib deb-src https://mirrors.aliyun.com/kali kali-rolling main non-free contrib替换完后更新源 apt-get upadteDVWA靶场环境搭建 使用git从github上把DV…

C#中XML文档与Treeview控件操作的数据同步

在前文《C#使用XML和Treeview结合实现复杂数据采集功能》中&#xff0c;使用Treeview展示了XML的数据&#xff0c;问题是如果在Treeview上进行了操作&#xff0c;怎样同步更改XML数据的内容呢&#xff1f; 这个问题看似简单&#xff0c;实现起来有一点小麻烦。 要实现的操作功能…

【2023年电赛国一必备】B题报告模板--可直接使用

任务 图1 任务内容 要求 图2 基本要求内容 图3 发挥部分内容 说明 图4 说明内容 评分标准 图5 评分内容 正文 &#xff08;部分&#xff09; 摘要 本实验的目标是设计并制作一个同轴电缆长度与终端负载检测装置&#xff0c;通过使用STM32主控和模拟电路进行实现。装置需…

基于EMQ的企信说明文档(包含EMQ安装步骤、JAVA后端、VUE前端)

基于EMQ的企信说明文档(包含EMQ安装步骤、JAVA服务端、VUE客户端) 整体数据流图&#xff1a; VUE简单demo: 什么是EMQ EMQ X R3.1 (Erlang/Enterprise/Elastic MQTT Broker) 是基于 Erlang/OTP 语言平台开发&#xff0c;支持大规模连接和分布式集群&#xff0c;简单来说&#…

angular material 表格分页 mat-paginator,设置分页大小标签内容

当我们不想要material 样式自带的文字时&#xff1a; 可以这样操作&#xff1a; import { MatPaginatorIntl } from angular/material/paginator;constructor(private paginator: MatPaginatorIntl) {paginator.itemsPerPageLabel 这里输入分页需要的提示文字; }

PHP国外在线教育系统源码 在线课程系统源码 直播课程系统源码提供在线课程,现场课程,测验

Proacademy是在线教育一体化的解决方案&#xff0c;用于创建类似于Udemy、Skillshare、Coursera这种在线教育市场。 这个平台提供在线课程&#xff0c;现场课程&#xff0c;测验等等&#xff0c;并有一个基于实际业务需要的高级认证插件&#xff0c;程序基于Laravel强大的安全框…

第R2周 - LSTM火灾温度预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 我的环境&#xff1a; 语言环境&#xff1a;Python3.10.7编译器&#xff1a;VScode深度学习环境&#xff1a;TensorFlow 2.13.0 一、前期工作&#xff1a; …

电脑第一次使用屏幕键盘

操作流程 1.在键盘上同时按WinR打开运行; 2.输入control 3.找到设置中心 4.点击屏幕键盘 效果 具体怎么使用 我不咋清除 简单 测试了一下 可以用鼠标点击屏幕键盘的按键 用键盘 按字母键和数字键 是和屏幕键盘不同步的 其他 tab、shift、后退、enter好像同步

Dubbo+Zookeeper使用

说明&#xff1a;Apache Dubbo 是一款 RPC 服务开发框架&#xff0c;用于解决微服务架构下的服务治理与通信问题&#xff0c;官方提供了 Java、Golang 等多语言 SDK 实现。 本文介绍Dubbo的简单使用及一些Dubbo功能特性&#xff0c;注册中心使用的是ZooKeeper&#xff0c;可在…

案例实践:小红书APP出现闪退问题,接口测试怎么做?(二)

Postman实现接口功能测试 新增货品接口实战 1、填写接口请求4要素&#xff1a; 由于货品新增接口文档找不到接口请求4要素中的&#xff1a;请求方法、请求地址和请求头&#xff0c;故&#xff0c;使用Fiddler抓包获取&#xff0c;获取结果如下&#xff1a; 1&#xff09;请求…

选择适合的项目管理工具,高效完成项目管理

很多项目经理想要知道项目计划执行的情况&#xff0c;大部分都是通过在线EXCEL文档&#xff0c;大家去更新进度&#xff0c;或者通过各种群消息&#xff0c;邮件&#xff0c;电话去通知项目经理项目执行进度&#xff0c;好一点的企业可能有专业的项目管理软件去收集进度&#x…

WebAPI文档与自动化测试

目录 1、控制器&#xff0c;项目属性里需要勾选输出Xml文档选项&#xff1a; 2、下载文档的网页数据 3、运行访问网址 4、接口测试&#xff1a; 5、批量测试&#xff1a; 6、微服务文档 总结&#xff1a; 本篇介绍框架的WebAPI文档与自动化测试 1、控制器&#xff0c;项…

Elasticsearchr入门

首先在官网下载elasticsearch8.9版本&#xff0c;以及8.9版本的kibana。 解压&#xff0c;点击es8.9bin目录下的elasticsearch.bat文件启动es 如图所示即为成功。 启动之后打开idea&#xff0c;添加依赖 <dependency><groupId>com.fasterxml.jackson.core</g…

【二开版】大魔王7.0-PHP来客云在线客服系统

前言 由于即时通讯软件不是存在敏感词汇就是收费&#xff0c;想找一个网上开源的又麻烦&#xff0c;来客云在线客服系统网上到处都能找到&#xff0c;但是由于开发时间太久&#xff0c;像公众号的一些消息服务受限不能用了&#xff0c;这一套客服系统只能做到基本的聊天对话功…

华为OD机试真题 Java 实现【最长的完全交替连续方波信号】【2023 B卷 200分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》…

TP DP PP 并行训练方法介绍

这里写目录标题 张量并行TP流水线并行 PPnaive模型并行GPipePipeDream 数据并行DPFSDP 张量并行TP 挖坑 流水线并行 PP 经典的流水线并行范式有Google推出的Gpipe&#xff0c;和微软推出的PipeDream。两者的推出时间都在2019年左右&#xff0c;大体设计框架一致。主要差别为…

Java阶段五Day19

Java阶段五Day19 问题解析 需求单查询列表功能的bug 业务逻辑&#xff1a; 需要用户登录&#xff0c;师傅入驻&#xff0c;审核入驻通过 查询师傅详情&#xff08;areaIds&#xff0c;categoryIds&#xff09; demand-server-dao-impl 包含持久层实现 requestOrderMappe…

JavaScript数据结构与算法——栈

文章目录 一、初始栈结构1.1 特性1.2 注意事项 二、栈结构的封装2.1 封装简单栈结构2.2 利用栈将十进制转二进制 一、初始栈结构 1.1 特性 类似于汉诺塔&#xff0c;后进先出&#xff0c;每次只能操作栈顶的元素。关键词&#xff1a;压栈、退栈 简单示意图&#xff1a; 1.…