C语言 文字常量的问题



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

我想要函数

__delay_us() 

然而

如手册中所述,此功能仅接受;"文字常量"参数。我曾想过,在计算延迟的持续时间 => 持续时间后,我可以使用:

__delay_us(D);

只要 D 是这样分配的:

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

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

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

#define D 20 

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

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

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

我的唯一选择是编写程序集函数并将持续时间的值传递给其中吗?

如果您的控制器具有低频 (~10 MHz),那么依赖用 C 编写的延迟函数将不准确(如您所述)和可靠。

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

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

根据编译器的不同,您可以使用#asm - #endasm指令或asm关键字或编译器手册中指定的任何其他方式在 C 程序中插入汇编代码片段。

PS:我从事过微控制器的工作,我知道当你需要为LCD提供1微秒的ON脉冲时,这有多困难。

最新更新