配置 SourceTrail 以接受带有 @ 语法的嵌入式 c/c++ 头文件

2024-07-01

我正在尝试使用 Sourcetrail (https://www.sourcetrail.com/ https://www.sourcetrail.com/)快速了解 pic18 系列微控制器的一些旧嵌入式 c/c++ 源代码。

导入硬件包含文件时出现错误,该文件使用一种奇特的方法来定义可位寻址硬件寄存器的硬件地址,如下所示pic18f26k22.h.

typedef union {
    struct {
        unsigned ANSA0                  :1;
        unsigned ANSA1                  :1;
        unsigned ANSA2                  :1;
        unsigned ANSA3                  :1;
        unsigned                        :1;
        unsigned ANSA5                  :1;
    };
} ANSELAbits_t;

extern volatile ANSELAbits_t ANSELAbits @ 0xF38;

正如您可能猜到的那样,SourceTrail 被@ 0xF38部分并期望只有一个分号。该方法被许多其他用于嵌入式系统的 c/c++ 编译器使用,因此我假设存在一个简单的修复方法。

Edit:

首先,澄清一下:@用于将易失性变量放置在内存映射中的特定位置,可以是位地址,也可以是字节地址。 (有点类似于 8086 CPU 的内存和 IO 寻址系统)。它用于全局包含(用于数百个不同的微控制器),在本例中,全局包含与 MPLab c/c++ 编译器一起提供。为了分析目的,我可以复制全局包含文件,并在 SourceTrail 中设置全局包含文件的不同路径 - 这样它们就可以根据需要进行修改。我不想碰项目文件,因为它们仍然需要在原始设置中进行编译。

在尝试 @Antti Haapala 回答时,我发现需要考虑以下类型的使用:

extern volatile unsigned char           BAUDCON1            @ 0xFB8;

#ifndef BANKMASK
#define BANKMASK(addr) ((addr)&0FFh)
#endif
extern volatile __bit                   ABDEN1              @ (((unsigned) &BAUDCON1)*8) + 0;
#define                                 ABDEN1_bit          BANKMASK(BAUDCON1), 0

我找不到__bit定义在任何地方,但它是一个特殊的结构,保存位的位地址(而不是字节地址)。


@ 不是 C 中的有效标记,因此您也不能将其用作宏标识符。最简单的解决方案是使用宏处理@地址,即

#ifdef somethingsomething
#define AT(address) @ address
#else
#define AT(address)
#endif

extern volatile ANSELAbits_t ANSELAbits AT(0xF38);

第一个定义应该由仅在目标上使用的宏来保护。使用简单的 Perl 脚本(例如

perl -pi -e 's/@\s*([0-9a-fA-FxX]+)/AT($1)/g' *.c *.h

If this @语法按原样在供应商提供的头文件中使用,然后对它们感到羞耻。

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

配置 SourceTrail 以接受带有 @ 语法的嵌入式 c/c++ 头文件 的相关文章

  • 如何在 C# 中检查互联网连接是否可用

    我为一家公司开发了一个软件 出于某种许可目的 我使用远程数据库来允许 禁止使用该软件 每次用户登录软件时都会应用此任务 如果互联网连接不存在或对远程数据库的查询失败 用户会收到错误 他无法登录软件并显示远程数据库http地址 我不希望他看到
  • 如何将流写入内存流?

    public void doprocess TcpClient client MemoryStream ms new MemoryStream Stream clStream client GetStream byte buffer 1 n
  • C++ 相当于 fscanf()?

    请不要说它是 fscanf P 我正在尝试替换这一行 if fscanf fp P c n ch 1 如果我理解正确的话 它会尝试读取 char 并将其存储到 ch 前提是它位于 P 和 n 之间 是对的吗 如果成功 它会返回1 它读取的字
  • 类内枚举前向声明是否可能? [复制]

    这个问题在这里已经有答案了 我知道在 C 11 中可以转发声明枚举类型 如果提供了存储类型 例如 enum E short void foo E e enum E short VALUE 1 VALUE 2 但我想转发声明一个类中定义的枚举
  • 如何管理 JSONP 响应中的 ' ?

    我需要像这样管理 char 在我的 JSONP 请求中 通过 jquery 使用 Ajax 所以 来自 C 这就是我所做的 myText Hello I m a string myText Replace Response Write Re
  • 在 OpenCV C++ 中使用 gpu::GpuMat

    我想知道如何修改gpu GpuMat 事实上我想知道是否可以使用gpu GpuMat like a cv Mat 我想做这样的事情 cv namedWindow Result cv Mat src host cv imread lena j
  • 空别名共享指针是否是无操作删除共享指针的良好替代方案?

    有时我需要shared ptr具有无操作删除器的实例 因为 API 期望shared ptr例如 它想要存储有限的时间 但我得到了一个原始指针 不允许我拥有比我运行的时间更长的时间 对于这种情况 我一直使用无操作删除器 例如 const v
  • 将数据路径数据到树状数据结构

    我有以下数据 root root blue root blue temp root main root main dev root main back root etc init root etc init dev root etc ini
  • C++14 中专门用于数组类型的分配器?

    为什么 c 14 中没有 std allocator 的数组模板专门化 当我自己尝试专门化 std allocator 时 我在实现 Construction 和 destroy 方法时遇到了死胡同 是这个原因吗 那么为什么 std all
  • UWP 导航 (Template10)、枢轴控制、多帧

    我正在尝试在我的 UWP 应用程序中实现以下导航样式 使用 Template10 但正在努力如何使用多个帧作为独立的历史堆栈 在枢轴的每个框架内 我希望有一个独立的框架 它有自己的历史记录和后堆栈 只能通过枢轴在框架之间导航 我正在考虑使用
  • 我应该如何继承IDisposable?

    为了保护无辜者 班级名称已更改 如果我有一个名为 ISomeInterface 的接口 我还有继承该接口的类 FirstClass 和 SecondClass FirstClass 使用必须处置的资源 二等舱没有 那么问题来了 我应该从哪里
  • 如何在C++中从Imagemagick图像获取缓冲区

    我正在使用 ImageMagick 库进行图像处理 我需要加载 bmp 图像 将其转换为 jpeg 将其加载到缓冲区中并通过网络发送 但是 我在 ImageMagick 中找不到任何可以在缓冲区中转换和存储数据的支持函数 我只能写入文件 尝
  • 将 wav 文件存储在数组中

    我需要一种快速方法来将 wav 文件的所有样本存储在数组中 我目前正在通过播放音乐并存储来自示例提供程序的值来解决这个问题 但这不是很优雅 从 NAudio 演示中 我有带有此方法的 Audioplayer 类 private ISampl
  • 尝试写入事件日志时出错 - 无法打开源“SourceName”的日志。您可能没有写入权限

    目前 我们正在尝试将现有的经典 ASP 页面集成到记录事件日志的新方法中 我们通过调用公开为 COM 对象的 NET 程序集来实现此目的 该程序集实际记录到事件日志中 这一切都正常工作 但是当我们尝试写入事件日志时 我们收到错误 无法打开源
  • 如何从库调用方法到 C# 控制台

    我在新库中创建了一个方法 这是我的代码 namespace ClassLibrary1 public class Class1 public static bool ISprime int prime if prime lt 2 retur
  • C 中的隐式类型转换

    我在维基百科上偶然发现了以下示例 http en wikipedia org wiki Type conversion Implicit type conversion http en wikipedia org wiki Type con
  • 如何为 Office AddIn 创建静默安装程序

    我在为使用 C 中的 VSTO 开发的 Outlook 加载项创建静默安装程序时遇到问题 安装程序是由 clickOnce 生成的 Outlookaddin vsto 此加载项将由 SCCM 在多台计算机上发布 我需要静默安装 但当软件包到
  • 跨 Web 服务列表<国家/地区> 变为国家/地区 []

    我有一个 Web 服务 调用时会返回一个包含多态列表的 Result 对象 但是 当我在客户端应用程序中添加引用时 公共字段将成为客户端应用程序中的国家 地区数组 如何将客户端应用程序中的字段更改为列表 public Result GetC
  • 如何防止禁用的 ToolStripMenuItem 在鼠标悬停时显示边框?

    Yes exactly same as the title in my project some of toolstripmenuitems were disabled But when i bring the cursor over th
  • “System.Int64”类型的表达式不能用于返回类型“System.Object”

    我正在尝试创建以下形式的表达式 e gt e CreationDate CreationDate属于类型long 但是我希望表达式返回一个object反而 我想用object作为返回类型 因为表达式是在运行时根据查询参数动态构建的 查询参数

随机推荐

  • Android 6.0 中的打瞌睡和应用程序待机模式

    Google 在 Android 6 0 操作系统中引入了 Doze 和应用程序待机模式 设备将进入Doze如果设备被拔掉并且在一段时间内未使用并且应用程序在一段时间内保持不活动状态 则该应用程序将进入模式StandBy模式 如果我错了请纠
  • Android Fragment 后台事务

    我正在开发一个带有片段的应用程序 它有一个 JavaScript 接口 在主 Activity 中调用 并具有片段替换逻辑 当应用程序位于前台时 一切正常 但当应用程序位于后台时 片段事务替换不起作用 当我返回应用程序时 我仍然看到旧片段
  • 调用exe中定义的函数

    我需要知道一种从 python 脚本调用 exe 中定义的函数的方法 我知道如何从 py 文件调用整个 exe 除非您的 EXE 是 COM 对象 或者像 dll 那样专门导出某些函数 否则这是不可能的 对于 COM 方法 请查看以下资源
  • Elasticsearch 字段名称区分大小写

    我正在寻找有关 ElasticSearch 中字段名称区分大小写的建议和最佳实践 以及是否有全局配置来使字段名称不区分大小写 另外 如果映射中不存在 是否可以禁止 ES 添加不同的字段 这是一个例子来说明这一点 1 使用小写的一个字段 名称
  • Android 自定义进度条不旋转

    我想更改默认动画ProgressBar 所以我在我的主题中添加了自定义样式 样式 xml 我在我的内部调用这种风格ProgressBar具有以下内容 进度条 xml
  • 从 iso 货币符号获取 NativeEnglishName,而不依赖于登录用户的当前文化

    我所拥有的是货币IsoCode EUR 此属性也可以在 RegionInfo 类 gt ri ISOCurrencySymbol 但 RegionInfo 类取决于当前登录的用户 我想要的是获得像 Euro 这样的 NativeEnglis
  • 如何使用 awk 在文本文件的第一行之前添加一个空行

    我有一些文本文件 我想在每个文本文件的第一行之前添加一个空行 我怎样才能用 awk 做到这一点 我会比较喜欢GNU sed对于此任务 要在文件开头添加空格 sed 1s file txt 要使用以下命令对多个文本文件执行此操作 txt扩展名
  • @AfterReturning 方面在切入点方法的同一事务中执行?

    我需要在执行函数后执行任务 我为此使用了 Aspect 但我有些困惑 我在 Spring 服务中有一个函数 A Transactional readOnly false isolation Isolation DEFAULT propaga
  • 如何用PHP识别google/yahoo/msn的网络爬虫?

    AFAIK SERVER REMOTE HOST 应该以 google com 或 yahoo com 结尾 但这是最有保障的方法吗 还有其他出路吗 您通过以下方式识别搜索引擎用户代理和IP地址 http www jafsoft com s
  • 比较 UITextView 中的文本?

    我们如何比较输入的文本UITextVIew用代码中的默认文本来确定它们是否相同 您可以使用以下方法NSString http developer apple com library mac documentation Cocoa Refer
  • 比较断言中的函数输出类型

    我正在努力使用 chai mocha 和 JS DOM 编写测试断言 我有一个简单的函数 例如 function HtmlElement el this element el instanceof HTMLElement el docume
  • HTML/CSS:清除中间的浮动元素,而不添加不需要的标签[重复]

    这个问题在这里已经有答案了 大多数 ClearFix 技术都涉及在父容器的最底部添加内容 我最喜欢伪元素方法 因为它不会将不需要的元素添加到 HTML 中 然而 最近我发现我正在处理一个容器 其中有一些孩子漂浮 但不是全部 假设前 2 个子
  • 使用 Jackson 反序列化非字符串映射键

    我有一张如下所示的地图 public class VerbResult JsonProperty similarVerbs private Map
  • 以同样的方式根据编号对数组进行洗牌

    我正在运行一个测验制作网站 我希望以打乱的顺序向用户显示问题的答案 我试图avoid如果我要随机打乱答案 则存储向用户呈现答案的顺序 我想以可预测的方式打乱答案 这样我以后就可以用同样的方式重复随机播放 显示结果时 我认为我可以按某个数字对
  • 获取 ES6 符号的描述

    我想知道是否有一种很好的方法来获取符号的描述 例如 var s Symbol 5 toString 的默认实现将简单地打印 符号 5 我想找到一种方法来提取实际描述 即 5 Symbol description https develope
  • C# 如何更改 windows.forms.listview 中的网格线颜色

    如何更改 windows forms listview 中的网格线颜色 我认为没有办法在不覆盖 Paint Event 的情况下在列表视图上执行此操作 但是 如果您能够切换到网格视图 您可以这样做 this dataGridView1 Gr
  • 添加标签以绘制 R 中的特定值

    我使用以下数据集创建一个图 并且我想仅为 DisplayName 列中标有 T 的点添加标签 Probe Name DisplayName X Y bob1 A 0 53 989643 7935 185 bob2 B T 55 11423
  • Android:getIntent() 已弃用

    我的程序由一个 MainActivity 和两个片段活动组成 我需要一个片段从用户那里获取一个字符串值并将其传递给第二个片段 我正在努力思考如何做到这一点 由于我熟悉意图 我发现这个答案 https stackoverflow com qu
  • 使用多处理或线程加速单个任务

    是否可以使用多处理 线程来加速单个任务 我的直觉是答案是否定的 以下是我所说的 单一任务 的示例 for i in range max pick random choice on off both 当参数为 10000000 时 在我的系统
  • 配置 SourceTrail 以接受带有 @ 语法的嵌入式 c/c++ 头文件

    我正在尝试使用 Sourcetrail https www sourcetrail com https www sourcetrail com 快速了解 pic18 系列微控制器的一些旧嵌入式 c c 源代码 导入硬件包含文件时出现错误 该