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

2023-11-04

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Keil MDK环境下FreeModebus移植踩坑记录 的相关文章

  • 【STM32】【HAL库】遥控关灯2 分机

    相关连接 STM32 HAL库 遥控关灯0 概述 STM32 HAL库 遥控关灯1主机 STM32 HAL库 遥控关灯2 分机 STM32 HAL库 遥控关灯3 遥控器 需求 接收RF433和红外信号 根据信号内容控制舵机 硬件设计 主控采
  • 什么是DevOps的三步工作法?

    作者介绍 张乐 DevOps时代联合创始人 高效运维社区合伙人 DevOpsDays大会 GOPS全球运维大会金牌讲师 国内首批DevOps Master 前百度资深敏捷教练 架构师 超过十四年敏捷转型 工程效能提升和大型项目管理实践经验
  • 电源篇 -- 降压电路(DCDC,非隔离)

    感谢阅读本文 在接下来很长的一段时间里 我将陆续分享项目实战经验 从电源 单片机 晶体管 驱动电路 显示电路 有线通讯 无线通信 传感器 原理图设计 PCB设计 软件设计 上位机等 给新手综合学习的平台 给老司机交流的平台 所有文章来源于项
  • 通过python实现局域网内传输大文件

    通过微信 网盘等进行传输速度很慢而且浪费流量 身旁又没有U盘等便携存储设备 那有没有一个方便的而且不用编程的局域网内传输的方式 那肯定有 step1 打开cmd cd进入需要分享的文件夹下 或者打开文件夹下 在当前路径下 打开cmd ste
  • Linux系统安装mysql

    1 卸载残留 如果服务器之前安装过mysql请先卸载 我这里是用yum安装的 现在通过yum去卸载 yum remove y mysql find name mysql 找到所有残留的文件 再通过rm rf去删除 2 卸载完成后 使用以下命
  • 乘积尾零

    如下的10行数据 每行有10个整数 请你求出它们的乘积的末尾有多少个零 5650 4542 3554 473 946 4114 3871 9073 90 4329 2758 7949 6113 5659 5245 7432 3051 443
  • R语言第七讲 线性回归分析案例

    题目 MASS 库中包含 Boston 波士顿房价 数据集 它记录了波士顿周围 506 个街区的 medv 房价中位数 我们将设法用 13 个预测变量如 rm 每栋住宅的平均房间数 age 平均房 龄 lstat 社会经济地位低的家庭所占比
  • 017-爬虫-爬虫结果存入 sqlserver

    先上图 结果 一 利用这个模块连接sql server import pymssql 引入pymssql模块 安装方式 conda install pymssql 二 连接失败的可能原因 参考此博客 需要开启几个服务 https blog
  • win10中anaconda安装tensorflow时报错Traceback (most recent call last): File “E:\Anaconda3\lib\site-packag

    windows系统anaconda安装tensorflow时报错解决办法 报错 Traceback most recent call last File E Anaconda3 lib site packages pip vendor ur
  • 数组的复制(Java技巧篇,四种方法详解)

    使用java lang System类中的arraycopy方法 优点 该方法可复制全部内容 也可复制一部分成为子数组 且目标数组与源数组没有关系 目标数组可以比源数组大 比较灵活 缺点 返回值为void 所以需要手动创建目标数组 参数含义
  • OA项目之我的审批(查询&会议签字&审批)

    目录 会议查询 会议签字 会议审批 讲解思路 我的审批查询功能 手写签批插件及工具类介绍 手写签批插件集成 手写签批功能实现 会议查询 MeetingInfoDao java 我的审批 public List
  • 毕业设计-基于机器学习的二维码和条形码识别

    目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度
  • STM32F10xNVIC探究与学习_2021-04-24

    NVIC探究与学习 嵌套向量中断控制器 NVIC NVIC 驱动有多种用途 例如使能或者失能 IRQ 中断 使能或者失能单独的 IRQ 通道 改变 IRQ 通道的优 先级等等 NVIC Enable 中断设置使能寄存器 Disable 中断
  • SQL Server 数据加密功能解析

    数据加密是数据库被破解 物理介质被盗 备份被窃取的最后一道防线 数据加密 一方面解决数据被窃取安全问题 另一方面有关法律要求强制加密数据 SQL Server的数据加密相较于其他数据库 功能相对完善 加密方法较多 通常来讲 数据加密分为对称
  • Redis的面试题

    1 为什么使用Redis做缓存 redis具有高性能和高并发的特点 redis为什么具有高性能 或者说redis为什么快 1 首先redis的数据存在内存中 所以比存储磁盘上的数据库快 2 其次redis本身使用了高效的数据结构 redis

随机推荐

  • win11WiFi驱动如何下载 windows11WiFi驱动下载的步骤方法

    Win11wifi驱动如何下载 现在很多用户都安装了最新的Win11系统 但是在使用的时候发现电脑原有的无线网卡驱动不匹配 需要安装win11wifi驱动 不知道win11wifi驱动下载安装方式 下面小编就教下大家win11无线网卡驱动下
  • Java中Callable接口(多线程实现的第三种办法)

    实现多线程程序的步骤 1 自定义类实现Callable接口 重写接口中的run方法 V call throws Exception 其余两种方法run 没有返回值 2 创建线程池对象 Executors 里面的那个方法 返回的是Execut
  • m1 使用anaconda安装tensorflow

    anaconda已经支持m芯片了 所以直接在官网下载 创建conda环境 conda create n tensorflow learn python 3 8 conda activate tensorflow learn 按照tensor
  • 十大新兴前端框架大盘点

    十大新兴前端框架大盘点 2019年在整体上 前端的主流框架没有太大的变化 业务代码仍由三大框架 React Vue Angular 所主宰着 打包工具一般仍使用webpack Rollup js 状态管理器还是Redux MobX 但随着这
  • 腾讯云视频上传问题总结

    使用腾讯云提供java sdk4 4 MultipartUploadVodFile使用此接口 分片上传 分片大小设置1024 1024 20会被腾讯服务器拒绝 无法上传 目前设置为1024 1024 5 最小分片设置为1024 512 域名
  • adaboost原理(包含权重详细解释)

    1 1 Adaboost是什么 AdaBoost 是英文 Adaptive Boosting 自适应增强 的缩写 由Yoav Freund和Robert Schapire在1995年提出 它的自适应在于 前一个基本分类器分错的样本会得到加强
  • 为什么说区块链的性能严重不足?

    现如今 性能过低是当前区块链技术面临的主要挑战之一 区块链的性能指标主要包括交易吞吐量和延时 交易吞吐量表示在固定时间能处理的交易数 延时表示对交易的响应和处理时间 在实际应用中 需要综合两个要素进行考察 只使用交易吞吐量而不考虑延时是不正
  • STM32CubeMX学习——旋转编码器模块

    前言 雨打灯难灭 风吹色更明 若飞天上去 定作月边星 李白 咏萤火 一 旋转编码器介绍 旋转编码器是一种可以左右旋转 同时也可以按下 也可以按下旋转的器件 通过左右旋转对应着内部不同开关的导通 同时按下也可以旋转 由此看来旋转编码器可以实现
  • 计算机msvcp120.dll丢失的解决方法

    计算机msvcp120 dll丢失的解决方法 相信困扰着不少小伙伴 msvcp120 dll系统文件是电脑重要的文件 丢失或者被损坏的话 很多软件跟游戏都会无法运行 需要怎么修复呢 小编今天就把教程分享给大家 修复教程如下 首先是打开电脑浏
  • el-dialog 对话框显示怎么往上调一调 或者往下调调显示

  • Python股票历史数据预处理(一)

    Python股票历史数据预处理 一 在进行量化投资交易编程时 我们需要股票历史数据作为分析依据 下面介绍如何通过Python获取股票历史数据并且将结果存为DataFrame格式 处理后的股票历史数据下载链接为 http download c
  • layui中form.val()使用,不起作用的原因

    在使用layui中 form表单数据的获取和渲染时绕不开的话题 在layui中form数据的渲染有个方法 form val 但是在使用的过程中很容易陷入误区 下面我就来为大家介绍如何解决form val 不显示的问题 let obj tit
  • error An unexpected error occurred: “https://registry.yarnpkg.com/axios: con 解决方案

    error An unexpected error occurred https registry yarnpkg com axios con 今天用在跑一个项目的时候发现了这个错误 看着像是网络连接不上 发现这里是用的Dokcerfile
  • 向ACCESS中的"时间/日期"字段中插入DateTime.Now时出现“标准表达式中数据类型不匹配。”错误的解决办法

    在使用下面的代码向Access数据库中添加数据的时候 如果是日期字段 则会出现 标准表达式中数据类型不匹配 的错误 这可能是C 中的日期类型无法直接转换成Access中的日期类型OleDbType DBDate所致 string Conne
  • Maximum Sum Subarray of Size K--滑动窗口题型

    滑动窗口题型 滑动窗口类型的题目经常是用来执行数组或是链表上某个区间 窗口 上的操作 比如找最长的全为1的子数组长度 滑动窗口一般从第一个元素开始 一直往右边一个一个元素挪动 当然了 根据题目要求 我们可能有固定窗口大小的情况 也有窗口的大
  • 电脑副业能做什么?一台电脑能做的副业

    现在很多人都想在工作之余开展一些副业 特别是今年经济形势不好 更让很多人明白了 有一份副业的重要性 这样可以在自己没有工作的时候还能有一份收入 那么有哪些副业可以在网络上做呢 如果你只有一台电脑的话 可以做哪些副业呢 1 自媒体 悟空问答或
  • Docker常用命令超细介绍,Java校招面试指南

    2 3 docker pull 前面我们介绍了 search命令可以从docker hub上搜索到相关的镜像 接下来看看我们通过docker pull 来下载镜像 docker pull 镜像名称 TAG 通过镜像加速下载还是比较快的 2
  • 解决下载github-production-release-asset-2e65be.s3.amazonaws.com上release文件慢的问题

    1 问题 去github下载BloomRPC工具进行测试grpc 果然一如既往的慢 想到把github转到码云进行下载 奈何我要下载的是release的文件 有两个代下地址 GitHub代下载服务 永久免费 这个最近貌似挂了 试试下面那个
  • java 之 反射 (结合Class理解)

    反射机制使静态语言java变为准动态语言 Reflection 反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息 并能直接操作任意对象的内部属性及方法 反射方式 实例化对象 getClass 方法 得到完整的
  • Keil MDK环境下FreeModebus移植踩坑记录

    Keil MDK环境下FreeModebus移植踩坑记录 文章目录 Keil MDK环境下FreeModebus移植踩坑记录 armcc arm compiler v5 环境 实验一 实验二 armclang arm compiler v6