1.7 如何使用c语言对寄存器进行操作
由于是寄存器地址、所以先将其强制类型转换为“volatile unsigned long*”
#define rBANKCON0 (*(volatile unsigned long *)0x48000004)直接解引用赋值
rBANKCON0 = 0x12;
1.12 static
1、修饰局部变量 ,使得生命周期变长了,存储位置也变了
2、修饰全局变量,使得只能在当前.c文件中使用,不能再其他.c中调用
3、修饰函数,使得只能在当前.c文件中使用,不能再其他.c中调用
1.13 const
const放在*前是修饰指向的对象,放在*后则是修饰指针本身
2.1 各种指针
一重指针,变量中存放的是一个地址
二重指针,指针变量中存放的是一个指针的地址
指针数组时数组,里面存放的是很多指针 int *a[10]
数组指针是指针,指针指向一个数组的首地址 int (*a)[10]
函数指针是指针,指向一个函数:int (*a)(int)
2.2
有符号 + 无符号 有符号会转换成无符号,正数的补码等于本身,负数的补码是反码加1(负数反码是一个大正数)
原码:为二进制的数,10的原码是0000 1010
反码: 正数的反码与原码相同,负数的反码是0变1,1变0
-10 的原码是 1000 1010 反码是 1111 0101
码:正数的补码与原码相同:如 10 原码为 0000 1010 补码 0000 1010
负数的补码为反码 +1 如 -10 反码是 1111 0101 补码是 1111 0110
2.5
int 指针 + int变量 = int指针的值 + 4(int 大小)
2.6
无符号char 0~255
2.7
char类型变量 -128~127
2.10
struct A
{
char t : 4; // 4位
char k : 4; // 4位
unsigned short i : 8; // 8位
unsigned long m; // 4字节
};
前两个一个字节 ,第三个一个字节,最后4个字节,内存对齐 1 + 1+填充+4 = 8
2.11
对齐数是1,因为设置了 #pragma pack(1),它会取消结构体的默认对齐方式,即按照成员变量的自然对齐方式来对齐,而采用按照 1 字节对齐的方式。因此,该结构体的各个成员变量会依次紧凑地分布在结构体内存空间中,没有填充字节。
2.12
数组地址 = 元素首地址
不同之处是 a + 1 就是下一个元素地址,&a+1 是移动一个数组的地址空间大小
2.13
指针 - 变量 = 指针地址移动变量类型空间大小
2.14
字符数组,数组中存放的是字符
字符串数组,数组中存放的是字符串,char str[2][3] 是字符串数组
2.15
p指向a[1],p[6]表示p向后移动六个数字
2.16
char *str[] 定义一个指针数组
char str[2][3] 定义一个字符串数组
3.1
全局区
.data
初始化不为0的全局变量和静态变量、const型常量在一块区域
.bss段
未初始化的、初始化为0的全局变量和静态变量在相邻的另一块区域
3.6
函数中的变量在函数结束后机会注销
3.7 野指针
指针没有初始化,任何刚创建的指针不能自动创建成为NULL
指针被free或者delete,没有置NULL
指针操作超越了变量的作用范围
3.13
堆内溢出:堆的尺寸设置过小,动态申请的内存没有释放
栈内溢出:栈的尺寸过小、递归层数太深、函数调用层次过深
1.11 复位中断与其他中断有什么不同
复位中断立即中止当前指令去执行中断、其他中断是等执行完当前指令再响应其他中断
1.1 异步IO和同步IO
同步io:程序需要进行I/O操作的时候会等待该操作执行结束再进行后续
异步io:程序需要进行I/O操作的是时候会继续执行下面的代码,等I/O操作结束才会处理该操作的结果
1.2 进程间通信方式
管道(pipe): 半双工 父子进程之间通信
有名管道:半双工 允许非亲缘进程之间的通信
信号量:是一个计数器,通常作为一个同步机制,用于进程和线程之间的同步
消息队列:是一个消息链表,存放内核中并且由消息队列标识符标识。消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限的问题
共享内存:一段可以被多个进程共同访问的内存,由一个进程创建。共享内存是最快的ipc
套接字:用于不同主机进程通信
信号:用于通知接收进程某个事件已经发生,是一种比较复杂的通信方式
1.6 什么是进程上下文、中断上下文
1、进程上文:是指进程由用户态切换到内核态是需要保存用户态的cpu寄存器的值,进程状态以及堆栈上的内容。
进程下文:是指切换到内核态后执行的程序,即进程运行内核执行的程序
2、中断上文:硬件通过中断触发信号,导致内核调用中断处理函数,进入内核空间。这个过程中硬件的一些参数需要传递,这些参数就是中断上文
中断下文:执行在内核空间的中断服务程序
1.13线程间通信和同步方式有哪些?
信号、信号量、互斥锁、条件变量、自旋锁、读写锁
内核申请函数的时候使用的函数是什么,应用申请内存
kmalloc:申请小块内存,连续的
kzalloc:小块内存连续但是内存块会被初始化为0
vmalloc:大块内存
malloc 应用程序申请内存
自旋锁和信号量使用的注意
1、自旋锁的进程不会睡眠,信号量会睡眠
2、中断就是自旋锁
写一个中断服务程序需要注意什么
1、中断服务程序需要断、尽可能将任务放在底半部
2、中断服务程序不能有阻塞,因为中断期间cpu是完全占据cpu、不存内核调度
3、中断服务程序的返回值要用操作系统定义的宏,不能用自己定义的