问题标签 [xc16]

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 投票
2 回答
1618 浏览

compiler-construction - Microchip XC16 中函数的绝对地址

器件:dsPIC33FJ128GP802

我有一些 *.s 文件如下

我在 *.h 中声明了相同的内容

现在我将 D1 传递给表读取函数

我的问题是,如果 D1 的地址在 0x8000 以上,则例程不正确。我尝试了大大小小的代码模型,但结果是一样的。我认为这是由于指针的 16 位限制。有什么方法可以直接从代码中访问 D1 的绝对地址。也许像内置函数或宏之类的东西。

请注意编译器手册说:

MPLAB XC16 C 编译器完全支持函数指针,允许间接调用函数。函数指针总是 16 位宽。

我已经发布了同样的问题

https://electronics.stackexchange.com/questions/56858/absolute-address-of-a-function-in-microchip-xc16

0 投票
1 回答
1841 浏览

c - 无法在 dsPIC33F 上初始化 PWM

我可能只是用这些寄存器之一看不到森林,但我无法让 PWM 在dsPIC33FJ32MC102微控制器上工作(警告:大 PDF)我'米玩弄。我已经遵循了数据表和进一步的应用说明(警告:另一个 PDF)甚至代码示例,但我看不出我做错了什么,尽管在我的测试台上我得到了高输出的 Vcc 和接地低输出。我已将故障引脚都绑定到 Vcc 并禁用了注册键码,因此我的更改应该会看到一些效果。我究竟做错了什么?

0 投票
1 回答
1036 浏览

c - c struct 将自身作为参数传递给指针函数

我正在尝试创建一个带有嵌套函数的结构,它将结构本身作为参数传递给嵌套函数,以简化调用函数。该代码将使用 xc16 编译器在 Pic 24f 系列 mcu 上运行。另外,我知道 count 函数是多余的,但我认为它说明了我的观点。例如:

结构:

功能:

主要的:

0 投票
2 回答
410 浏览

c - C:使用头文件中的函数最小化代码重复

这是一个有点奇怪的用例,因此很难搜索现有的讨论。我正在为嵌入式系统(使用 XC16 编译器的 Microchip PIC24)编程,目前正在跨 3 个独立的 UART 通道(每个 UART 将从主数据表中获取数据)实现相同的通信协议。

我开始编写项目的方式是让每个 UART 由一个单独的模块处理,其中有很多代码重复,类似于以下伪代码:

UART1.c:

UART2.c:

虽然上述内容简洁且运行良好,但实际上通信协议本身相当复杂,因此将其复制 3 次(只需更改对 UART 寄存器的引用)会增加引入错误的机会。拥有一个函数并传递指向它的指针不是一种选择,因为这会对速度产生太大影响。代码需要在每个 UART 的内存中物理复制。

我想了很多,尽管知道从不将函数放在头文件中的规则,但还是决定尝试使用包含重复代码的特定头文件,并将引用作为#defined 值:

协议.h:

UART1.c:

UART2.c:

当代码编译没有任何错误时,我有点惊讶!但它似乎确实有效,编译后 MPLAB X 甚至可以计算出所有符号引用,因此 UART1.c 和 UART2.c 中的每个宏引用都不会被识别为不可解析的标识符。然后我意识到我可能应该将protocol.h 文件重命名为protocol.c(并相应地更新#includes),但这实际上并不是什么大问题。

只有一个缺点:IDE 不知道在模拟或调试时单步执行包含在 protocol.h 中的代码时要做什么。它只是在代码执行时停留在调用指令处,因此调试会有点困难。

那么这个解决方案有多hacky?C神会因为我考虑这个而惩罚我吗?有没有我忽略的更好的选择?

0 投票
2 回答
812 浏览

c - 如果一个结构同时定义了它的 uint16_t 字和 uint8_t 字节,则数组的大小加倍

我有一个数组,每个元素可以是 uint16_t 或一对 uint8_t。

它的元素被定义为一个 uint16_t 和一个 2 个 uint8_t 的子数组的联合。

不幸的是,编译器 (MicroChip XC16) 为数组分配了两倍的内存。

编译器分配 4 个字节而不是它应该分配的 2 个字节。

解决方法:如果我将结构更改为:

编译器应该分配 2 个字节,但这是不正确的:

虽然它仍然有效:

(除了调试器不显示其值的不便)。

问题:我应该接受解决方法,还是应该使用更好的解决方案?

请参阅之前关于此的讨论,其中建议了上述解决方案。


编辑。

根据 EOF 的建议(如下),我检查了 sizeof。

解决方法之前:

解决方法后:

这表明它是一个编译器错误。

0 投票
1 回答
1468 浏览

microchip - dspic33FJ128MC802上ADC读数一直跳动,无法获得稳定读数,mplab8.92,xc16编译器

晚上好,

我正在尝试在 dspic33FJ128MC802 上实现一个简单的 1 通道 ADC 读取器,它可以手动开始采样数据,在采样完成时自动转换,并读取和存储数据。

这对我来说从来都不是问题,除了这个微控制器,它似乎没有实现正常的 ADC,

我已经通读了数次关于 ADC 的数据表部分,并且我已经将其配置为我的最佳能力,但是当我将实验室电源直接连接到输入时,ADC1BUF0 值会在 0 到 4096 之间不一致地跳跃ADC的引脚。

我看到的是 ADC1BUF0 值似乎大致对应于输入电压(0-3.3V),当我暂停调试器时,它给出了几个(2-4)个读数在 +-100 范围内(4096 是不错)。然后,如果我继续运行并暂停,电压保持不变,存储在缓冲区中的值突然开始跳跃 +- 500,有时甚至显示 4095(全 1)和 0。

然后,当我将实验室 PSU 更改为不同的电压时,它似乎重复了向我显示几个正确值的过程,然后又开始跳来跳去。

所以本质上,它会在我暂停调试器的 1/2 时显示一个正确的值。

我不知道是什么原因造成的,我知道我需要在改变电压后运行调试器,以便它可以清除缓冲区,但是关于这个微控制器的某些东西似乎肯定是错误的。

请让我知道可以做些什么来解决这个问题,

编译器是 XC16,IDE 是 Mplab 8.92

谢谢,

下面是我的配置:

[代码]

[/代码]

0 投票
1 回答
317 浏览

c - 内存映射显示分配给神秘变量 _powers_ 和 _npowers_ 的空间

我一直在查看我的代码的内存映射(用 c 编写并由 XC16 编译器编译),并看到在 .data 段中分配给powersnpowers和 dpowers 的大量空间。

有谁知道这个分配是做什么用的?

我的代码使用浮点库以及 printf/scanf - 这可能是这些函数的工作空间吗?

以下是地图文件中的两个片段:

...和...

0 投票
2 回答
662 浏览

c - 如果定义是在使用后出现的,为什么 XC16 编译器会删除内联函数?

在 XC16 编译器的手册中,它说如下:

如果内联函数被声明为静态并且函数定义在函数的所有使用之前,编译器只会消除内联函数。

在 foo.c 的顶部我声明

然后在 ISR 的定义中定义为:

然后,作为测试,我将定义放在nop_10_times文件的底部。

当我编译我的项目并查看程序集时,似乎编译器实际上能够完全删除程序集中的函数,并且只将内联代码留在 ISR 中调用它的位置。

有谁知道它是如何做到这一点的?根据手册中的定义,它表示如果“函数定义在函数的所有使用之前”,它将消除内联函数。

0 投票
3 回答
198 浏览

c - mplab xc8/16 builtin_constant_p

我在 mplab 编译器用户指南中搜索此内容,但没有找到任何内容。我在这里要求它确认我不是盲人或任何东西:

GCC 编译器提供了一些非常有趣和有用的内置函数,例如 __builtin_constant_p(x) 或类似的东西。我从未在微芯片编译器中发现过类似的东西,而且我认为没有。

那么问题来了:Microchip XCxx 编译器是否提供除特定于设备的函数之外的任何非标准内置函数(例如在给定寄存器地址声明变量或声明中断函数)?

编辑:澄清更多:我最感兴趣的是从编译器中检索信息。一个很好的例子是类似 builtin_constant 的东西,因为它使程序可以使用通常不可用的信息。但我不将这个问题限制为仅查找常量表达式。

0 投票
2 回答
9898 浏览

c - GCC 错误“导致节类型冲突”

为什么在尝试将两个仅在初始化值不同的(RAM)变量放入同一部分时会出现编译器错误?

问题

C源:

(相关的)GCC编译器输出:

链接器脚本在定义中包含以下行SECTIONS,但(致命)错误来自编译器,而不是链接器。

更多信息

更改 C 源代码以允许编译器使用两个节允许编译通过,但如果两个输入节映射到同一个输出节,则链接器会生成错误。

C源:

链接器脚本:

(相关)链接器输出:

在 C 源代码中交换行的顺序只会改变哪个部分(出现在 C 源代码中的第二个)是错误的。

问题

对于以零初始化的变量,对于以非零初始化的变量,GCC 编译器需要哪些属性,反之亦然?

编译器是否试图将初始化为零的变量放在该.bss部分中,而不是.data用于初始化数据的部分?或者是否有另一部分用于初始化为零的数据?

相关问题

出现的类似问题涵盖了内存类型(ROM 与 RAM)之间的冲突问题:

...或将初始化const数据放入 NOLOAD 输出部分:

... 或者对于原因仍然是一个谜,并且可能与此有关:

据我所知,以上任何一个似乎都没有我可以在这个问题上申请的答案。