编程语言(2)
2008-02-23 05:32:10来源:互联网 阅读 ()
int a,b,c;
a = inWord(0x100); /*读取I/O空间0x100端口的内容存入a变量*/
b = a;
a = inWord (0x100); /*再次读取I/O空间0x100端口的内容存入a变量*/
c = a;
很可能被编译器优化为:
int a,b,c;
a = inWord(0x100); /*读取I/O空间0x100端口的内容存入a变量*/
b = a;
c = a;
但是这样的优化结果可能导致错误,假如I/O空间0x100端口的内容在执行第一次读操作后被其他程式写入新值,则其实第2次读操作读出的内容和第一次不同,b和c的值应该不同。在变量a的定义前加上volatile关键字能够防止编译器的类似优化,正确的做法是:
volatile int a;
volatile变量可能用于如下几种情况:
(1) 并行设备的硬件寄存器(如:状态寄存器,例中的代码属于此类);
(2) 一个中断服务子程式中会访问到的非自动变量(也就是全局变量);
(3) 多线程应用中被几个任务共享的变量。
CPU字长和存储器位宽不一致处理
在背景篇中提到,本文特意选择了一个和CPU字长不一致的存储芯片,就是为了进行本节的讨论,解决CPU字长和存储器位宽不一致的情况。80186的字长为16,而NVRAM的位宽为8,在这种情况下,我们需要为NVRAM提供读写字节、字的接口,如下:
typedef unsigned char BYTE;
typedef unsigned int WORD;
/* 函数功能:读NVRAM中字节
* 参数:wOffset,读取位置相对NVRAM基地址的偏移
* 返回:读取到的字节值
*/
extern BYTE ReadByteNVRAM(WORD wOffset)
{
LPBYTE lpAddr = (BYTE*)(NVRAM wOffset * 2); /* 为什么偏移要×2? */
return *lpAddr;
}
/* 函数功能:读NVRAM中字
* 参数:wOffset,读取位置相对NVRAM基地址的偏移
* 返回:读取到的字
*/
extern WORD ReadWordNVRAM(WORD wOffset)
{
WORD wTmp = 0;
LPBYTE lpAddr;
/* 读取高位字节 */
lpAddr = (BYTE*)(NVRAM wOffset * 2); /* 为什么偏移要×2? */
wTmp = (*lpAddr)*256;
/* 读取低位字节 */
lpAddr = (BYTE*)(NVRAM (wOffset 1) * 2); /* 为什么偏移要×2? */
wTmp = *lpAddr;
return wTmp;
}
/* 函数功能:向NVRAM中写一个字节
*参数:wOffset,写入位置相对NVRAM基地址的偏移
* byData,欲写入的字节
*/
extern void WriteByteNVRAM(WORD wOffset, BYTE byData)
{
…
}
/* 函数功能:向NVRAM中写一个字 */
*参数:wOffset,写入位置相对NVRAM基地址的偏移
* wData,欲写入的字
*/
extern void WriteWordNVRAM(WORD wOffset, WORD wData)
{
…
}
子贡问曰:Why偏移要乘以2?
子曰:请看图1,16位80186和8位NVRAM之间互连只能以地址线A1对其A0,CPU本身的A0和NVRAM不连接。因此,NVRAM的地址只能是偶数地址,故每次以0x10为单位前进!
|
图1 CPU和NVRAM地址线连接 |
子贡再问:So why 80186的地址线A0不和NVRAM的A0连接?
子曰:请看《IT论语》之《微机原理篇》,那里面讲述了关于电脑组成的圣人之道。
总结
本篇主要讲述了嵌入式系统C编程中内存操作的相关技巧。掌控并深入理解关于数据指针、函数指针、动态申请内存、const及volatile关键字等的相关知识,是个优秀的C语言程式设计师的基本需要。当我们已牢固掌控了上述技巧后,我们就已学会了C语言的99%,因为C语言最精华的内涵皆在内存操作中体现。
我们之所以在嵌入式系统中使用C语言进行程式设计,99%是因为其强大的内存操作能力!
假如您爱编程,请您爱C语言;
假如您爱C语言,请您爱指针;
假如您爱指针,请您爱指针的指针!
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: 如何为嵌入式应用编写优秀的C 代码呢?
下一篇: 嵌入式linux C编程 -
- C++学习笔记(一) 2018-09-05
- 【2018.08.19 C与C++基础】编程语言类型系统简介(草稿) 2018-08-26
- C语言范例学习01 2018-06-18
- 使用C语言来实现模块化 2018-06-18
- 编程语言——C----细节 2018-06-18
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash
