没想到上次写学习的笔记 居然会有近400人阅读过,对我这种菜鸟来说是莫大的鼓励啊
感谢大家的关心 文章中的不足也希望大家不吝赐教 谢谢谢谢~
今天我的笔记主要是书中第十一章:事件处理与内核定时器,还有十二章中断处理的开头。这两章讲的i386体系和我要研究的ARM体系有些区别,比如默认的Hz值:i386是1000,ARM中是100/128/200/1000;再比如处理器中中断向量存储个数,i386中有若干个,ARM经过仲裁貌似只处理一个。书上是针对i386讲的 希望日后看完针对ARM体系嵌入式的书后,我可以类比到ARM体系中~
一、u64
- u8, u16, u32, u64 -> unsigned 8bit, 16bit, 32bit, 64bit
-
s8, s16, s32, s64 -> signed 8bit, 16bit, 32bit, 64bit
其实就是无符号64位长度的正数
这样定义是为了跨平台数值不变,号称是因为同是int或long不同体系定义长度未必相同。
详见:
二、Hz函数和USER_Hz函数
- #define DIFF_TIME(30)
-
u64 aftertime;
-
aftertime=get_jiffies_64()+DIFF_TIME*(Hz/USER_Hz);
-
-
-
#define DIFF_TIME(3*Hz/10)
-
u64 aftertime;
-
aftertime=get_jiffies_64()+DIFF_TIME;
两个函数的目的都是求得0.3秒后的时间,结果一样。
Hz函数在2.4内核中是100,2.6内核中是1000;后来查得i386中USER_Hz为100不变,这样计算结果就一样了
三、同一函数 用两个指针分别表示的数据结构
- typedef struct
-
{
-
struct timer_list timer;
-
................
-
}__attribute__((packed)) KERNEL_TIMER_MANAGER;//叫KERNEL_TIMER_MANAGER的新结构体 包含很多东西
-
-
static KERNEL_TIMER_MANAGER *ptrmng=NULL; //这里声明新结构体叫做*ptrmng
-
...
-
void AAAAAA(KERNEL_TIMER_MANAGER *pdata,.........)//AAAAAA函数中里调用管新结构体叫做pdata
-
{....(&(pdata->...))} //系统的timer_list结构体中 各种赋值
-
...
-
-
int BBBBBB_init //驱动开始
-
{
-
ptrmng=kmalloc(....,...)
-
AAAAAA(ptrmng,2*Hz/10) //给KERNEL_TIMER_MANAGER分配内存,AAAAAA计算完会将内存都写满零
-
if(ptrmng==NULL) //如果内存为空
-
{
-
pdata=...
-
AAAAAA(pdata,2*Hz/10)//如果怎样就把pdata返回六个A,继续处理 直到处理完 AAAAAA再将内存清零
-
}
-
} //如此循环
其实不全都是原程序,这是整理过以后的。这个数据结构对我来说挺难的,我花了一个小时在脑袋里编译 了一下 化简掉不少东西,从init开始整理了一下,不知道思路对不对。
我的理解是Kernel_Time_Manager这个新的结构体,内存上是*ptrmng指针(大小和头地址完全一致)。其 中有一部分内存上存有操作所需的数据,既*pdata。换言之Kernel_Time_Manager == *ptrmng >= *pdata
这个不知道对不对,受限于现在读程序的能力也就这个水平…
四、memset( , ,)
- void *memset(void *s,int c,size_t n)
作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。
今天书中用这个特性把一段内存清零了。
详见:
阅读(4272) | 评论(3) | 转发(0) |