C拾遗

本文探讨了volatile关键字在内存操作中的作用,确保CPU直接从寄存器而非缓存读取数据,避免编译器优化。同时介绍了assert断言的正确使用方式及其在调试中的重要性。

*( 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"

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值