c - 文字常量的问题

标签 c embedded c-preprocessor

我正在使用 Hi-Tech C 编译器对 PIC16F876 进行编程。我处于必须使用延迟的地步,每次程序运行时的持续时间都不同。

我想要这个功能

__delay_us() 

但是,

此函数只接受,如手册所述; “文字常量”参数。我原以为,在计算了延迟的持续时间后 => duration 我可以使用:

__delay_us(D);

只要像这样分配D:

#define D duration  //where duration is an unsigned long

但是,方法不起作用。似乎每当我使用#define 时,如果我分配的值是可变的,编译器就会抛出错误?? (没想到会这样,我还以为变量的当前值会在赋值的时候变成常量。。)

如果我分配一个实际数字,例如:

#define D 20 

这工作正常,但我希望能够更改 D 的值。

我可以猜到为什么这不起作用:高科技 C 编译器无法为延迟生成汇编代码,除非它确切地知道它是什么(在编译器时)。

我不能使用带有例如 1us 延迟的循环,因为单步执行循环所需的时间会改变延迟(我需要它非常准确)。

我唯一的选择是编写一个汇编函数并将持续时间的值传递给它吗?

最佳答案

如果您的 Controller 频率较低(~10 MHz),那么依赖于用 C 编写的延迟函数将不准确(如您所述)和可靠。

应该使用汇编代码来获得适当的延迟。

在汇编级别,您可以微调延迟,因为您知道每条指令所需的时间(机器周期和所需的 T 状态数)。您也可以在 Controller 的数据表中找到相同的内容。

根据编译器的不同,您可以使用 #asm - #endasm 指令或 asm 关键字,或在编译器手册。

附言:我曾研究过微 Controller ,我知道当您需要向 LCD 提供 1 微秒的 ON 脉冲时会有多困难。

关于c - 文字常量的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19493673/

相关文章:

c++ - 使 cpp(C 预处理器)删除 Mac OS X 上的 C++ 注释

c - 如何将#defined 字符串插入到 system() 命令中? (win32)

C fopen vs open

c++ 等效于 calloc 并为数组变量声明空间

embedded - 硬件看门狗和软件看门狗有什么区别?

linux - mx5x 的 uboot 镜像

C#define 语句、枚举、结构

c - 用户输入 - C(不允许某些字符)

c - 段错误 - sprintf

c - radiotimer_start() C 函数背后的逻辑是什么?