- 博客(28)
- 收藏
- 关注
原创 高通看门狗驱动-MSM Watchdog
源码中的文档:不论是软狗还是硬狗,大体思路都差不多:准备一个定时器,定时10s,超时之后启动地球毁灭程序~~~。为了防止地球毁灭,需要时不时的将计时器的计数值清零,称为喂狗。一般看门狗定时器是无论系统跑飞还是卡死都能正常运行的,一般超时后直接拉CPU的reset引脚,让系统复位。先看probe函数:static int msm_watchdog_probe(struct p...
2020-04-19 15:44:49 2849
原创 CFS-完全公平调度器
CFS实现的公平的基本原理是这样的:指定一个周期,根据进程的数量,大家”平分“这个调度周期内的CPU使用权,调度器保证在一个周期内所有进程都能被执行到。CFS和之前O(n)调度器不同,优先级高的进程能获得更多运行时间,但不代表优先级高的进程一定就先运行:调度器使用vruntime来统计进程运行的累计时间,理想状态下,所有进程的vruntime是相等时代表当前CPU的时间分配是完全公平的。但事实...
2020-02-06 15:09:36 819
原创 恶霸调度器-实时调度器
1.内核如何组织调度实体:struct task_struct { ... struct sched_rt_entity rt; ...}struct sched_rt_entity { struct list_head run_list; unsigned long timeout; unsigned long watchdog_stam...
2020-01-03 22:13:14 275
原创 Linux调度-调度时机和调度条件
struct thread_info { unsigned long flags; /* low level flags */ int preempt_count; /* 0 => preemptable, <0 => bug */ };作为一个正经的程序,它不可能从一开始运行就需要一直占用CPU直到地球毁灭,可能某些时候需要等待一些资源无...
2020-01-03 22:01:30 569
原创 Linux调度-关于抢占的几个配置
config PREEMPT_NONE bool "No Forced Preemption (Server)" help This is the traditional Linux preemption model, geared towards throughput. It will still provide good latencies most of the ...
2020-01-03 21:35:53 872
原创 Linux调度-主调度器
核心调度器,其实就是schedule这一个函数,当一个进程觉得自己无事可做了,可以调用该函数释放CPU,让其他进程占用CPU完成任务。粗略看下代码,做了一些注释。asmlinkage __visible void __sched schedule(void){ struct task_struct *tsk = current; sched_submit_work(tsk); do...
2019-10-11 19:47:09 439
原创 Linux调度-周期性调度器
很早以前有一个问题:搞单片机的时候,在不做响应任何中断的前提下,任何一个模块代码跑一个死循环,机器一定会卡死。但是到了接触linux之后,发现不论是在内核中还是用户层代码中,while(1)把机器搞死机这样的操作完全失效了,这是为什么?原来,这是周期性调度器的功劳,前提内核是抢占式内核在系统时钟中断来之后,在中断处理函数中会通过tick_periodic最终调到scheduler_tick,...
2019-09-29 10:51:37 569
原创 Linux调度-概览
1.调度什么?直接把task_struct直接串起来一个个调度?还是专门设计一个结构来做用于调度的实体2.什么时候调度?也就是何时该去发动调度器去切换下一个任务?3.怎么调度?策略是什么?当要切换下一个任务时选择的原则是什么?调度什么?直接把task_struct直接串起来一个个调度?还是专门设计一个结构来做用于调度的实体?内核中有一个结构叫运行列队(runqueue),根据实时和完...
2019-09-27 14:22:33 229
原创 Linux的优先级
linux的优先级表示很叫人头大,所有就总结了一张图:再看看代码,文件prio.h的一些宏:#define MAX_NICE 19#define MIN_NICE -20#define NICE_WIDTH (MAX_NICE - MIN_NICE + 1) //nice优先级max和min的跨度是40#define MAX_USER_RT_PRIO 100#define ...
2019-09-10 15:13:43 2308 1
原创 Linux如何处理信号
从Crtl+C开始:之前一直有一个问题:在shell下运行一个程序,每次想中途停止这个程序时,下意识的就会按下Ctrl+C就可以终止当前阻塞在终端的进程,Ctrl+C这个组合键按下到底都发生了什么?其实这个操作就是向前台进程发送SIGINT信号。以下是linux支持的信号列表:使用kill -n pid或在代码中使用int kill(pid_t pid, int sig);可以向一...
2019-09-09 17:15:00 199
原创 Linux的内核的信号量
信号量结构很简单,各个成员的作用通过名字基本就知道干啥用的:struct semaphore { raw_spinlock_t lock;//保证信号量原则操作的锁 unsigned int count;//“量”,如果为1一般叫互斥量,>1叫做计数信号量 struct list_head wait_list;//当信号量无法获取时,进程可以在这排队等着};结合信号量的...
2019-09-09 16:55:24 210
原创 Linux的链表
什么是链表?链表可以想象成就是一条锁链,每一个环上面都可以刻些信息在上面,有新的信息要记录就拿出新的一环把信息刻上去然后打开锁链一头加上去,要使用上面的某一环取下来即可。把这些信息串起来方便管理(排序、增减、查找)该怎么实现链表?比如说把一个班的学生用链表的形式连接起来,可以是这样:但是以上的将next指向下一个节点(直接指向下一个student)的设计方法用起来没什么毛病,但...
2019-09-04 22:39:39 251
原创 串口通讯协议
关键词解释:波特率:每秒传送的BIT位数。说到底只是每位电平持续的时间,波特率越高,持续的时间越短。如波特率为9600bps,即每一位传送时间为1000ms/9600=0.104ms,即位与位之间的延时为0.104毫秒。如图:在空闲时,正电平逻辑通讯总线上基本都是被拉高的,即处于高电平。UART是通用异步收发器的意思使用的就是串行通信接口:
2017-03-15 21:16:49 825
原创 ARM的中断
Exynos4412采用GIC中断控制器,主要是因为Contex-A9 是多核处理器,GIC(Generic Interrupt Controller)通用中断控制器用来选择使用哪个CPU接口,具体主要有两个功能: 1)分配器:设置一个开关,是否接收外部中断源;为该中断源选择CPU接口; 2)CPU接口:设置一个开发,是否接受该中断源请求;
2017-03-13 22:12:12 772
原创 C语言可变长参数列表原理与实现
可变参数在编程中的实现。 stdarg.h标准库提供的宏支持了可变长参数列表的使用。 当然,在一些情况下也可以自己通过其实现原理来使用可变长参数编程。 条件一: C语言编程中函数的形参入栈顺序都是从右至左。栈的生长方向是,低地址《—— 高地址,而且栈由系统分配,不存在碎片化内存。 结论:只要知道一个参数的地址,就可以顺势推出其他参数的地址。在使用可变长参数的情形下,都会想方设法的标注参数的
2017-03-08 19:17:29 988
原创 可移植的单片机printf(print by format)函数实现
一个有趣的实验: 说明%号一出现要么被”吃掉”要么他会终止与f,d,s。 那么再加以大胆猜想: 假设 int sprintf(const char *format, …); 当然我们需要可变参数标准库的支持因为调用的可变参数的方法。当读取到了一个%号,就开始匹配fds中的任意一个,每种的处理方式都不一样。分别是: char *itoc(int value); char *ftoc(
2017-03-08 13:37:42 2957
原创 stdarg的用法(可变参数的用法)
stdarg宏: 可变参数列表是通过宏来实现的,这些宏定义于stdarg.h头文件,它是标准库的一部分。 这个头文件声明的一个va_list的类型,和三个宏va_start,va_arg,va_end。我们可以生明一个va_list类型的变量,配合三个宏使用。 va_start(arg, last have name arg); 初始化之后,arg将指向第一个无名参数。 va_arg(ar
2017-03-07 16:36:39 580
原创 关于立即数
在汇编时,我们常会用到立即数。但是立即数是有条件限定的:当一个数小于255不用判断,它是立即数。当大于255时:把数据转换成二进制形式,从低位到高位写成4位1组的形式。if(count of 1 > 8)isNotImmediate;else{if(数据中间有连续的大于等于24个0){循环左移4的倍数,使高位全为0;找到最高位的1
2017-03-04 15:32:38 3983
原创 汇编C语言混合编程
ARM汇编语言和C语言混合编程 ATPCS规则体现了一种模块化设计的思想,其基本内容是C模块(函数)和汇编模块(函数)相互调用的一套规则(C51中也有类似的一套规则)。我感觉比在线汇编功能强大(不用有很多忌讳),条理更清楚(很简单的几条规则)。ATPCS规则内容:1)寄存器的使用规则1、子程序之间通过寄存器r0~r3来传递参数,当参数个数多于4个时,使用堆栈来传递参数。此时r0~r
2017-03-04 15:31:04 888
原创 ARM—工作状态,工作模式
ARM32位ARM指令集Thumb指令集(一个不完整的)区别:Thumb指令集是ARM指令集的空间压缩的子集,Thumb指令集不能替代ARM指令集由于Thumb指令的长度为16位,即只用ARM指令一半的位数来实现同样的功能,所以,要实现特定的程序功能,所需的Thumb指令的条数较ARM指令多。在一般的情况下,Thumb指令与ARM指令的时间效率和
2017-02-27 21:18:03 516
原创 ARM的异常响应
ARM模式:异常处理流程:四大步三小步(CPU自动处理)因为在异常中断处理程序人口的一些指令是ARM指令,然后根据需要,程序可以切换到 Thumb 工作状态,在异常中断处理程序返回前,程序在切换到 ARM 工作状态。用ARM结构手册中的代码描述如下:R14_ = return link SPSR_ = CPSRCPSR
2017-02-27 21:09:29 747
原创 c标准文件io函数的原型和注意点
fopen()需要头文件:#include函数原型:FILE *fopen(const char *path,const char *mode)函数参数:path:要打开的文件的路径及文件名mode:文件打开方式,见下函数返回值:成功:指向文件的FILE类型指针失败:NULL以下是mode参数允许使用的取值及说明:r或rb 以只读的方式打开文件,该文件必须存在r
2017-01-08 14:32:23 344 1
原创 格式化io与非格式化io得对比理解
测试函数1#include<stdio.h>#include<string.h>int main(){ int a[5]={65,66,67,68}; char value[10],i; FILE *pf; if(!(pf = fopen("printf.txt","w+"))) { perror("open file:");
2017-01-07 16:56:40 1685
原创 linux下制作一个动态库
制作一个动态库我们可以使用gcc工具来制作一个动态库示例:自己制作一个动态库,库函数的功能是传递一个字符串并输出。第一步:需要准备3个文件:hello.h、hello.c、test.c。其中hello.h和hello.c用于制作动态库,test.c是测试程序主函数第二步:使用gcc编译生成动态库gcc hello.c -fPIC -c -o hello.ogcc h
2017-01-01 20:59:28 4526
原创 快速排序法的理解
快速排序法的理解:假设有一个无需排序的从小到大序列(接下来都是以小到大认为是正确顺序): 1 2 3 4 5 排序的思路其实就是让每个数字归位,那么正确位置具有一个特征,就是这个位置左边的数都比这个位置的数小,右边反之.比如 2 1 3 5 4 的三就在正确位置.那么如何做到呢?就是下面的 1-6 步骤是将代码口语化的形式;首先函数应该有四个参数:a[];l
2016-12-27 20:05:09 276
原创 c语言实现二叉树的遍历和创建程序(附带注释)
/******************************************************************///树的递归思想,把每个节点当作是一棵树,以后序遍历为例//步骤1:访问左子树.2访问右子树3.打印当前节点的值//在节点遍历时如果某节点没有左节点或者是右节点是传递的指针是NULL//说明下一步没有树了可以返回/***************
2016-12-23 21:43:32 4503
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人