问题标签 [hi-tech-c]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
377 浏览

c - Hi-Tech C 编译器:#define:“获取此对象的地址是非法的”

我正在尝试使用 Hi-Tech C 编译器为 PIC16F77 微控制器编译代码。

下面的代码在下面代码段的最后一行给出了一个错误。错误是:

我已将问题缩小到以下几点:

ADCON0是具有用于控制 ADC 的标志的 8 位寄存器。)

知道代码有什么问题吗?

谢谢

0 投票
0 回答
351 浏览

c - 将 HiTech C 库与 MPLAB MCC18 结合使用

有没有人尝试过将 Hi-Tech PIC18 C 库与 MPLAB MCC18 编译器和链接器一起使用?我们是一个小团体,收到了一个用 MCC18 编写的遗留项目。我们有兴趣使用 Hi-Tech 编译器的更标准和扩展的 printf/sprintf 函数。监管问题使我们无法简单地切换到 Hi-Tech 编译器。

具体来说,我们正在尝试替换以不同方式处理 ROM 和 RAM 字符串数据的弱 MCC18 方法(putsUSART 和 putrsUSART),并使用标准 printf,它不关心数据是基于 ROM 还是基于 RAM。此外,我们希望 printf/sprintf 也能处理浮点数,而无需编写我们自己的 ftoa() 函数。

我过去使用过 Hi-Tech 编译器,它们的 stdio 功能与 MCC18 的功能不同,使用起来很愉快。我们有两个编译器,所以我正在考虑使用 HiTech 编译器创建一个 .LIB,然后将其与 MCC18 代码库链接。

任何尝试过或使用过它的人的评论将不胜感激。

0 投票
2 回答
11575 浏览

c - 变量声明冲突,类型重新声明

我有这些错误和警告......我对编程很陌生,我不知道这意味着什么。你们能看看这个并告诉我我做错了什么吗?

提前致谢

错误和警告:

有错误的代码(我已将错误的行号放在描述中):

0 投票
3 回答
1290 浏览

embedded - 使用 PIC 16f777a 开启/关闭

我正在使用按钮进行锻炼。当按下按钮时,LED 开始闪烁,再次按下时停止。当我尝试时,LED 在第一次按下时闪烁,但在第二次按下时没有停止。我正在使用带有 HiTech C 编译器的 PIC16F877A MCU。我的代码是:

0 投票
1 回答
190 浏览

c - Hitech C 语法

有人可以解释一下这个语法吗?它来自 Hi Tech C 包含文件

0 投票
3 回答
293 浏览

c - '错误 ”;” 初始化多个结构时的预期'

我有一个 typdef'd 结构,紧接着在下面我使用 typedef'd 结构同时声明和初始化了我想要的变量。

当我尝试编译代码时,没有与 'hi_aud' 相关的错误消息,但其余结构会显示错误 'error: ";" 预期的'。该数组也提出了这个警告,加上'错误:“}”预期'。

我正在使用 Hi-Tech C compiler v.,它使用 C90 ANSI C 标准。

编辑当我使用'{}'括号初始化数组时,出现另一个错误“错误:声明中没有标识符”。当我使用“[]”括号时,不会发生这种情况。

0 投票
3 回答
216 浏览

c - 我们在嵌入式 c 或嵌入式 c++ 中有“@”运算符吗?如果是,请解释我下面的代码?

代码:

此代码来自 PIC16F877A 的 HT-PICC 编译器 pic.h 库文件

我了解 static volatile 和其他关键字的含义。这里 Timer0 的寄存器地址是 0x01 但为什么要@放在前面呢?它与指针有关吗?

0 投票
1 回答
113 浏览

c - 如何修复 68HC11 编译器生成无效的 JMP/BRA 代码

我正在编译 C 代码以对设备的 EPROM 进行编程。使用的编译器是 Hi-Tech C Compiler。我相信它是 7.80 版本。

当我(重新)制作我的代码时,它会生成一个二进制 (*.BIN) 文件,用于闪存到 EPROM。

我发现编译后的代码通常在程序集中带有一行代码,这会破坏代码并导致设备在到达时关闭。似乎编译器正在将 Branch-Always (BRA) 语句更改为错误地执行BRA 0,当转换为十六进制操作码时JMP 0000,编译器会将其转换为。这会导致代码到达代码的意外区域,从而导致设备关闭。

重新制作代码时,这个错误的分支总是在同一个地方。但是我发现,如果我对代码进行小幅更改,不同的 BRA 调用会得到完全相同的损坏。

我现在觉得我需要深入研究 *.BIN 文件本身,找到错误的 BRA/JMP 调用,然后手动修复它。这样做的问题是,每当我对代码进行更改然后创建一个新的二进制文件时,我都需要追踪这个错误的 BRA/JMP 调用,计算应该存在的 BRA 调用的正确操作码是什么,并自己编辑。我宁愿每次进行更改时都不必这样做,因为这会占用大量时间。

这是错误 BRA 调用及其周围代码的示例。很抱歉,我无法为此提供完整的源代码,因为它适用于专有系统,但我可以围绕该问题分享汇编代码和十六进制代码。

等效的 C 代码,并添加了错误 BRA/JMP 发生位置的注释:

这是来自已编译的 *.AS 程序集文件:

上述bra 0程序集无效。在这种特殊情况下,根据汇编文件中的标签,它应该是bra l28(注意,这是 L28,带有小写 L,以避免混淆。它是在汇编代码中定义较低的标签,其中此分支应该去)。

这将产生以下十六进制操作码:

以下摘录来自 *.LST 列表文件。

可以看出,它将 转换bra 0JMP 0000(7E 0000)。

我想找到一个可以彻底解决这种情况的解决方案,这样编译器就不会再破坏程序集中的随机 BRA 助记符,不需要我挖掘二进制文件、找到 JMP 调用并手动修复它。是时候更改代码了。

为了澄清,我理解这BRA 0与 不同JMP 0000,但是编译器出于未知原因(1)放入BRA 0程序集文件而不是BRA l28它应该是什么,以及(2)JMP 0000在创建二进制文件时将其转换为。