*( volatile unsigned int *)(addr) = data;
volatile保证cpu不会去cache里取数据,而是会直接从寄存器取。不会让编译器自动进行优化,对寄存器的操作通常要加上volatile。
要判断NULL按下面方法更改代码,可以在这个函数最前面加入断言
assert((NULL != str1) && (NULL != str2))但要注意断言assert 是仅在Debug 版本起作用的宏,是在Debug时做的无害测试。若想在Release 版也可
以判断NULL,那我们必须用别的代码来判断。
可以在程序前面加入if判断
if ((NULL != str1) && (NULL != str2))
{
return 0;
}
printf("%s:%d\n",__func__,__LINE__);
sprintf(s, "%p", &i);
可以打印出i的地址
assert断言的作用,如果它的条件返回错误,则通过调用abort终止程序的执行;
assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销;
在调试结束后,可以通过在包含#include <assert.h>之前插入#define NDEBUG来禁用assert调用,示例代码如下:
#include <stdio.h>
#define NDEBUG
#include <assert.h>
int a=3;
printf("0x%08x\n",a); 结果:0x00000003
printf("%x\n",a); 结果:3
Linux内核设计与实现P13
内核开发者通常把那些对时间要求比较高,而本身长度又比较短的函数定义成内联函数;
定义一个内联函数的时候,需要使用static作为关键字,并且使用inline限定它。比如:
static inline void dog(unsigned long tail_size)
内联函数必须在使用之前就定义好,否则编译器就没法把这个函数展开。
实践中一般在头文件中定义内联函数。由于使用了static作为关键字进行限制,所以编译时不会为内联函数单独建立一个函数体。如果一个内联函数仅仅在某个源文件中使用,那么也可以把它定义在该文件开始的地方。
%x:以16进制输出整形变量;
static inline void nand_read_1w(UINT32 *buf);
#include "../nand_new_ctl.h"
本文探讨了volatile关键字在内存操作中的作用,确保CPU直接从寄存器而非缓存读取数据,避免编译器优化。同时介绍了assert断言的正确使用方式及其在调试中的重要性。
567

被折叠的 条评论
为什么被折叠?



