对于论文我正在寻找使用volatile变量的现实 C函数。这本身并不难找到,但我正在寻找一个函数,其中volatile函数的值必须在函数执行过程中更改对于函数的特定分支要达到。像这样:
typedef struct {
unsigned :6;
unsigned FLAG1 :1;
unsigned FLAG2 :1;
} __attribute__ ((packed)) REGISTER;
volatile REGISTER * io_ = 0x1234;
int write_to_io()
{
while (io_->FLAG1) {};
//io_->FLAG1 is now 0
io_->FLAG2 = 1;
sleep(10);
if (io->FLAG1)
return 1; //io->FLAG1 has changed from 0 to 1
else
return 0; //io->FLAG1 has not changed
}
如果在执行函数期间结构的不同位发生了变化就足够了,但我的主要标准是,对于要达到的某个分支,在期间,volatile变量的值会发生变化执行该功能。
我会非常感谢任何现实生活中的例子。我无法在网上找到很多使用volatile的例子。
答案 0 :(得分:8)
规范(和可移植)示例处理异步信号。 (您可以使用Ctrl-C将SIGINT传递给您的程序。)
#include <signal.h>
#include <stdio.h>
volatile sig_atomic_t quit;
void signal_handler(int sig)
{
signal(sig, signal_handler);
quit = 1;
}
int main(void)
{
signal(SIGINT, signal_handler);
puts("Hit return to poll quit flag");
while (!quit) getchar();
return 0;
}
答案 1 :(得分:3)
选择您喜欢的开源操作系统,并寻找旧的设备驱动程序,您会发现一些没有其他工作方式的人。
答案 2 :(得分:2)
我的老师的一些例子,它没有使用一个编译器(lcc)的volatile,但是当我使用我的gcc端口为该处理器运行时,它就被打破了。我不得不放入挥发物。
static int volatile busTimeoutSeen;
int busTimeoutISR(int irq) {
busTimeoutSeen = 1;
return 1; /* skip offending instruction */
}
int memsize(void) {
unsigned char volatile *ptr;
unsigned char b;
ISR oldService;
busTimeoutSeen = 0;
oldService = getISR(16);
setISR(16, busTimeoutISR);
ptr = (unsigned char *) 0xC0000000;
while (1) {
b = *ptr;
if (busTimeoutSeen) {
break;
}
ptr += (1 << 12);
}
setISR(16, oldService);
return (ptr - (unsigned char *) 0xC0000000) >> 12;
}
它从所有页面连续读取,直到我们越过最后一页,这会导致中断,这会将busTimeoutSeen
设置为1.由于这种情况发生在幕后,我们告诉编译器读取和写入数据始终记忆。
答案 3 :(得分:0)
内存映射IO是一个示例,其中内存中的值实际上可能表示从诸如COM端口的设备读取。当我学习C时,这是使用volatile关键字的示例之一。