嵌入式Linux-周报告(First)

来源:互联网 发布:朱诺号变轨 知乎 编辑:程序博客网 时间:2024/05/22 10:46

嵌入式Linux-周报告(First)
写总结是一种习惯,成长的路上养成好的习惯尤其重要。
一,本周学习的内容
1.U-Boot。
2.Linux内核设计与实现-定时器。
二, UBoot总结
本周开始学习了UBoot的基本内容,了解了UBoot的概念和作用,并且亲自动手在Ubuntu下
编译了UBoot的源码,使用的是2012.10版本。之后便是通过视频来逐步的了解UBoot的源码。
首先分析了是arch/arm/cpu/armv7/start.S文件,该文件是使用ARM汇编编写的汇编文件,通
过分析这个文件,我了解了下面的一些内容:
1.开发板的启动流程。
2.底层常见的 读取-修改-写回 的操作模式。
3.OS的分支预测技术。
4.增加了UART的基本知识。
除了这些,我还完成了2个重要的实验:
1.在start.S中添加点亮LED灯的汇编代码,并且调试通过,进而更深一步的了解了
UBoot的可执行文件的结构,并且在Linux和Windows分别下载到SD卡中运行成功。
2.编写了myboot文件,自己实现一个简单的点亮LED的程序,其中的汇编文件,链接
脚本文件等都是自己编写的,并且基本学会了使用objdump和hexdump调试底层的目标代码
和可执行代码。然后又使用Makefile对编译过程进行了优化,做完这个实验,收获非常多。
最后就是学到的很多的补充内容:
1.关于PC指针的知识。
2.关于CPU指令流水线的问题。
3.异常向量的地址映射问题等等。
4.。。。还有很多
附上一张自己总结了UBoot部分思维导图,后面会不断更新的。
这里写图片描述
以上就是本周UBoot的学习总结。

三, Linux内核定时器简介
时间在内核中有很重要的用途,比如说检查当前进程是否用尽了时间片,如果用完了,就重新进行进程调度等等。
介绍2个概念:
1.节拍率:HZ
如果一个CPU的频率为100HZ,那么它的周期为1 / 100 = 10ms, 也即10ms一次时钟中断,每秒钟产生100次时钟中断,HZ可以表示CPU每秒钟中断的次数。ARM和x86CPU的频率一般都为100HZ,也可以更改。
2.全局变量:jiffies
jiffies用来记录自系统启动以来产生的节拍的总数。每次时钟中断处理程序会增加该变量的值。1s内时钟中断的次数等于体系结构的HZ,jiffies在1s内增加的值即为HZ。
下面是2个转化公式:
(1).以秒为单位转化为jiffies:seconds * HZ,内核常用这个转化
(2).jiffies转化为妙:jiffies / HZ

下面介绍使用内核定时器的方法
在使用内核定时器时,不需要深入了解它的结构。
1.创建定时器

struct timer_list my_timer;

2.初始化定时器

init_timer(&my_timer);

3.填充定时器结构

my_timer.expires = jiffies + delay;//延时的节拍数delaymy_timer.data = 0;//超时处理函数的参数my_timer.function = my_function;//超时处理函数

4.定义my_function

void my_function(unsigned long data);

5.激活定时器

add_timer(&my_timer);

内核除了定时器管理时间外,还使用延迟执行功能,下面介绍延迟执行功能:
1.忙等待
最简单的延迟方法

unsigned long timeout = jiffies + 10;//delay 10 节拍while (time_before(jiffies, timeout)){    cond_resched();//重新调度进程}

2.短延迟
内核建议使用下面的3个函数来延迟很短并且很精确的时间。

void udelay(unsigned long usecs);void ndelay(unsigned long nsecs);void udelay(unsigned long usecs);

3.最理想的延迟方法是使用schedule_timeout()
该方法会让需要延迟执行的任务睡眠到指定时间耗尽后再重新运行,但是不能保证正好等于指定时间,只能尽量接近指定的延迟时间,即延迟时间有误差。

/* 将任务设置为可中断睡眠状态 */set_current_state(TASK_INTERRUPTIBLE);/* seconds 秒后唤醒 */schedule_timeout(seconds * HZ);
0 0
原创粉丝点击