Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1255597
  • 博文数量: 160
  • 博客积分: 4132
  • 博客等级: 中校
  • 技术积分: 2086
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-06 21:56
文章分类

全部博文(160)

文章存档

2012年(25)

2011年(120)

2010年(15)

分类: LINUX

2011-01-18 17:45:44

没想到上次写学习的笔记 居然会有近400人阅读过,对我这种菜鸟来说是莫大的鼓励啊
感谢大家的关心 文章中的不足也希望大家不吝赐教 谢谢谢谢~
    
今天我的笔记主要是书中第十一章:事件处理与内核定时器,还有十二章中断处理的开头。这两章讲的i386体系和我要研究的ARM体系有些区别,比如默认的Hz值:i386是1000,ARM中是100/128/200/1000;再比如处理器中中断向量存储个数,i386中有若干个,ARM经过仲裁貌似只处理一个。书上是针对i386讲的 希望日后看完针对ARM体系嵌入式的书后,我可以类比到ARM体系中~


一、u64
  1. u8, u16, u32, u64 -> unsigned 8bit, 16bit, 32bit, 64bit
  2. s8, s16, s32, s64 -> signed 8bit, 16bit, 32bit, 64bit
 其实就是无符号64位长度的正数
 这样定义是为了跨平台数值不变,号称是因为同是int或long不同体系定义长度未必相同。
 详见: 


二、Hz函数和USER_Hz函数
  1. #define DIFF_TIME(30)
  2. u64 aftertime;
  3. aftertime=get_jiffies_64()+DIFF_TIME*(Hz/USER_Hz);


  4. #define DIFF_TIME(3*Hz/10)
  5. u64 aftertime;
  6. aftertime=get_jiffies_64()+DIFF_TIME;
 两个函数的目的都是求得0.3秒后的时间,结果一样。
 Hz函数在2.4内核中是100,2.6内核中是1000;后来查得i386中USER_Hz为100不变,这样计算结果就一样了


三、同一函数 用两个指针分别表示的数据结构
  1. typedef struct
  2. {
  3.  struct timer_list timer;
  4.  ................
  5. }__attribute__((packed)) KERNEL_TIMER_MANAGER;//叫KERNEL_TIMER_MANAGER的新结构体 包含很多东西

  6. static KERNEL_TIMER_MANAGER *ptrmng=NULL;        //这里声明新结构体叫做*ptrmng
  7. ...
  8. void AAAAAA(KERNEL_TIMER_MANAGER *pdata,.........)//AAAAAA函数中里调用管新结构体叫做pdata
  9. {....(&(pdata->...))}                             //系统的timer_list结构体中 各种赋值
  10. ...

  11. int BBBBBB_init                 //驱动开始
  12. {
  13.   ptrmng=kmalloc(....,...)
  14.   AAAAAA(ptrmng,2*Hz/10)        //给KERNEL_TIMER_MANAGER分配内存,AAAAAA计算完会将内存都写满零
  15.     if(ptrmng==NULL)            //如果内存为空
  16.      {
  17.        pdata=...
  18.        AAAAAA(pdata,2*Hz/10)//如果怎样就把pdata返回六个A,继续处理 直到处理完 AAAAAA再将内存清零
  19.       }
  20. }                              //如此循环
 其实不全都是原程序,这是整理过以后的。这个数据结构对我来说挺难的,我花了一个小时在脑袋里编译  了一下 化简掉不少东西,从init开始整理了一下,不知道思路对不对。
 我的理解是Kernel_Time_Manager这个新的结构体,内存上是*ptrmng指针(大小和头地址完全一致)。其  中有一部分内存上存有操作所需的数据,既*pdata。换言之Kernel_Time_Manager == *ptrmng >= *pdata
 这个不知道对不对,受限于现在读程序的能力也就这个水平…


四、memset( , ,)
  1. void *memset(void *s,int c,size_t n)
 作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。
 今天书中用这个特性把一段内存清零了。
 详见:





阅读(4218) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

小雅贝贝2011-01-19 13:44:40

sillyboytao: 嘿嘿 我觉得也是,写完更清晰了.....
支持。也感谢你支持博客啊~~呵呵

sillyboytao2011-01-19 13:41:22

小雅贝贝: 加油啊。多写写有好处哦~~.....
嘿嘿 我觉得也是,写完更清晰了

小雅贝贝2011-01-19 09:19:07

加油啊。多写写有好处哦~~