在外企做服务器开发, 目前是项目经理, 管理两个server开发的项目。不做嵌入式好久了。
全部博文(197)
分类: LINUX
2007-11-15 12:51:40
思考以下问题:
思考题:
1> 学习volatile , 为什么要用volatile ?什么条件下用volatile ? volatile 对driver有什么用?
为什么我们下面的程序用到了 volatile , 为什么 kernel自带的watchdog 的driver (drivers/char/watchdog/s
2> 强化c语言编程知识,
找出下列的定义有什么区别?
const int a;
const int *a;
int *const a;
int const *a;
const int *const a ;
const int const *a ;
再写driver 的时候, 声明变量的时候, 还是严谨一些比较好。该加const 最好加const ,免得意外出错。
3> 到google上学习 , 对齐方面的知识 , 写一个宏, 实现 32 对齐, 分为 32向前对齐和向后对齐: fn_before(33) = 32 , fn_after(33) = 64
学习 __attribute__((__packed__)) 到底是什么意思? 明白后, 继续学习 GNU 其他的扩展语法。
//先自己写, 然后再对照这个程序。
核心的部分, 就是下面几句。
思想就是 把 一段内存的起始地址转换为一个结构体的指针 , 这样 ,就可以通过结构体 来存取 寄存器的值, 写起程序来, 比较方便 和便捷 。
//一定要用 volatile来定义, 对于写driver ,定义寄存器一定要用volatile 修饰
typedef volatile u8 S
typedef volatile u16 S
typedef volatile u32 S
#define S
#define S
#define S
/* WATCH DOG TIMER (see manual chapter 18) */
typedef struct {
S
S
S
} /*__attribute__((__packed__))*/ S
#define S
static inline S
{
return (S
}
static void wdt_enable(void)
{
//这里用const 修饰符, 表示 , rWATCHDOG 是个指针常量。
S
u16 COUNTER_VALUE = heartbeat * ( 50000000 / (PRESCALER + 1) / DIVISION_FACTOR );
//WATCHDOG DAT REGISTER
rWATCHDOG->WDTDAT = COUNTER_VALUE;
//WATCHDOG COUNTER REGISTER
rWATCHDOG->WDTCNT = COUNTER_VALUE;
//write WDTCON register
rWATCHDOG->WDTCON &= ~0xff00; //bit8~bit15 清零,然后写入PRESCALER
rWATCHDOG->WDTCON |= (PRESCALER << 8);
rWATCHDOG->WDTCON |= S
}
//可以对比一下, 用 readb/readw/readl() 代码量就多了不少, 而且 不自然。 !虽然是这样, kernel的开发者还是推荐用 readb/w/l () 系列的函数, 最新的就是 ioread8/16/32()系列函数。
static void wdt_enable(void)
{
u32 tmp; //255 //128
u16 COUNTER_VALUE = heartbeat * ( 50000000 / (PRESCALER + 1) / DIVISION_FACTOR );
//u16 COUNTER_VALUE = (1 << 16) -10;
printk("COUNTER_VALUE=%hu\n",COUNTER_VALUE);
printk("S
//写入 S
iowrite32(COUNTER_VALUE, S
//写入S
iowrite32(COUNTER_VALUE, S
tmp = ioread32(S
tmp &= ~0xff00; //bit8~bit15 清零,然后写入PRESCALER
tmp |= (PRESCALER << 8);
//再写入division factor
tmp &= ~(0x03 << 3);
tmp |= 0x03 << 3; //11b is 128 division
printk("the value written S
iowrite32(tmp, S
//重新eanble reset
tmp = ioread32(S
iowrite32(tmp |S
//test,
tmp = ioread32(S
printk("S
}