摘要:char * a= "1234"; 此时不能通过解引用来修改a指向内存的值,因为它指向常量区;当然,可以更改a的指向
阅读全文
摘要:1 char a[] = { 'c','+','+' }; 2 char c[] = "c++"; 3 cout << strlen(a) << endl; 4 cout << strlen(c) << endl; 5 cout << sizeof(a) << endl; 6 cout << siz
阅读全文
摘要:首先要编译出带调试信息的程序,加个-g参数 gdb 程序名 进入gdb模式 ulimit -c unlimied 设置core文件大小为没有限制 break 文件名 : 行号 设置断点 (甚至可以设置条件断点)info breakpoints可以查看断点信息 list first,last 列出代码
阅读全文
摘要:重写打印申请到的地址,通过addr2line来定位 gcc的内建函数__builtin_return_address来返回函数调用者的地址
阅读全文
摘要:数据分片:在发送端对用户数据进行分片,在接收端进行重组,由TCP确定分片的大小并控制分片和重组;到达确认:接收端接收到分片数据时,根据分片数据序号向发送端发送一个确认包;超时重发:发送方在发送分片后计时,若超时却没有收到相应的确认包,将会重发对应的分片;滑动窗口:TCP连接双方的接收缓冲空间大小都固
阅读全文
摘要:TCP面向连接,通过三次握手建立连接,四次挥手接除连接;UDP是无连接的,即发送数据之前不需要建立连接,这种方式为UDP带来了高效的传输效率,但也导致无法确保数据的发送成功。 TCP是可靠的通信方式。通过TCP连接传送的数据,TCP通过超时重传、 数据校验等方式来确保数据无差错,不丢失,不重复,且按
阅读全文
摘要:C/C++共有 static修饰局部变量(比如函数中的局部变量),此时这个变量的位置就在全局静态区,但仍旧只能在函数内部访问,比如 1 #include <iostream> 2 using namespace std; 3 4 void test(){ 5 static int a=0; 6 a+
阅读全文
摘要:BSS段 所有未被显示地初始化的全局变量和静态变量(包括局部静态变量) 所有被显式地初始化为0的全局变量和静态变量(包括局部静态变量) 符合上述两种条件的变量被存放在BSS段中
阅读全文
摘要:调度时机 单核模式下,RTOS允许高优先级任务被唤醒的时候立即得到执行 我们之前在Linux的时候得到的结论是,高优先级任务挂到就绪队列上了,但是并不一定能够马上得到执行的,还是要等到tick到了,在内核模式下切换任务 这里我们换个角度想想,什么情况下,高优先级任务会挂就绪队列上?释放信号量、发消息
阅读全文
摘要:RTOS的mutex(互斥量、互斥锁)自带优先级继承功能,非常方便 信号量有点类似于生产者和消费者的模式,一个生产,另一个只负责消耗 而互斥量像是一个固有公共资产,各部门轮流使用 互斥量、互斥锁,本来的概念确实是:谁上锁就得由谁解锁。 但是FreeRTOS并没有实现这点,只是要求程序员按照这样的惯例
阅读全文
摘要:优先级:C>A>B A开启ADC,全部转换完后在DMA中断中设置标志位,A检测标志位后释放互斥量,代表一次采样完成,数据已经到了ram里了,B可以去读了 此时B可以获取互斥量,关ADC,并把数据搬到内存中的另外一个位置(这样做的原因是,计算过程中,源数据不可修改),释放互斥量,并且可以开始FFT运算
阅读全文
摘要:栈帧在程序中负责保存程序的局部变量、参数与函数最终执行完后的返回地址。我们在写C语言代码时经常会接触到的一个概念“局部变量”就是由栈帧来负责保存维护的。 模拟栈帧过程非常好的文章:https://blog.csdn.net/weixin_43815930/article/details/104823
阅读全文
摘要:这篇文章介绍得很好 https://blog.csdn.net/YuZhiHui_No1/article/details/38567399
阅读全文
摘要:先说结论:事实上在中断处理中调用schedule或sleep等函数,未必会直接进入panic(部分厂商提供的内核会,这样保证了程序员可以更早的发现问题) 有些内核版本,中断会单独开一些中断栈,并没有task_struct等结构,被调度走了以后,就调度不回来了,那么中断处理就有问题了 但早期有些内核版
阅读全文
摘要:开启debug的方法: 1、在想要打印log的文件下,添加一个#define DEBUG 2、在makefile中通过KCFLAGS传递 设置kernel printk的日志等级为8 修改printk的默认日志级别的方法有多种,例如直接修改printk.c(新kernel为printk.h)中的CO
阅读全文
摘要:根据相位和极性分类 CPOL=0,空闲低电平 CPOL=1,空闲高电平 CPHA=0,第一跳变沿采集 CPHA=1,第二跳变沿采集 分析一段代码: 1 /* CPOL = 1, CPHA = 1, MSB first */ 2 uint8_t SOFT_SPI_RW_MODE3( uint8_t w
阅读全文
摘要:总结得最好的文章: https://blog.csdn.net/weixin_44933419/article/details/114991088 要点: 三种速度的工作模式 标准、快速、高速 三种信号 1、开始信号: SCL 为高电平时, SDA 由高电平向低电平跳变,开始传送数据。2、结束信号:
阅读全文
摘要:上下半部 下半部三件套 中断中到底该用什么锁? 自旋锁。因为用互斥锁的话可能会让出CPU,在中断上下文中让出CPU是不可接受的
阅读全文
摘要:如何打开一个文件 首先贴出整体的流程: compat_sys_openat|-->do_sys_open |-->do_filp_open |-->do_filp_open |-->path_openat|-->path_init # nd初始化。|-->link_path_walk # 真实寻找。
阅读全文
摘要:进程页表与内核页表 所有的进程共享一份内核页表,所有的进程页表各不相同 内核页表在bring up的时候创建,而进程页表在进程创建的时候填写,对于内存页申请的同步(比如内核申请了一块内存,在进程页表中的同步)往往发生在pagefault的时候 CPU访问虚拟地址的时候总是通过MMU先访问TLB,再访
阅读全文
摘要:貌似只有硬件中断才是真正意义上的 异步,会在程序意想不到的位置发生,其他的机制诸如信号、系统调用、软中断等等,总是在某个 同步 的位置去处理他们 进程调度的时机 系统发生调度的时机如下: 调用cond_resched()时 显式调用schedule()时 从系统调用或者异常中断返回用户空间时 从中断
阅读全文
摘要:inline、volatile、#define、typedef、const、static const 需要强调的是const的意思是只读,意义在于不希望程序员对它进行修改,事实上它的值是会变的,比如一些硬件的状态寄存器 常量指针:比如整型指针指向的是一个整型,所以常量指针说的是指向一个常量的指针,那
阅读全文
摘要:kmalloc,相当于kernel在访问硬件寄存器的时候,申请的内存,无论是物理还是虚拟地址空间都必须是连序的 vmalloc,虚拟连序,但物理地址上并不连序,vmalloc效率较低,因为要另外建立页表项,映射虚拟地址与物理地址 vmalloc一般在申请大内存的时候才会使用,此外不会立即更新到进程页
阅读全文
摘要:信号量 这里贴出一篇很好的文章 https://blog.csdn.net/weixin_43914272/article/details/108317212 信号量有二值、计数、整型 二值的话相当于一个互斥量了,只有0和1两种状态,线程要么获得资源然后运行后释放,要么阻塞等待,直到信号量被释放 信
阅读全文
摘要:断言assert 就是对表达式进行判断,如果条件不成立就会调用abort()中止程序运行,对于debug空指针有奇效,但是release版本不会用 是一个宏而非函数 五个要点: 1.在函数开始时,监测参数是否合法。2.每个断言只能检测一个条件。因为条件过多,当出现错误时,无法判断是哪个条件出错。3.
阅读全文
摘要:这里贴一篇讲得很好的 https://blog.csdn.net/weixin_46098577/article/details/116596183?ops_request_misc=%257B%2522request%255Fid%2522%253A%25221662084446167816839
阅读全文
摘要:这篇讲得很好 https://blog.csdn.net/sjp11/article/details/123899141?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166201751616781790748003%2522%252
阅读全文
摘要:select原理 说在前面,整个select在内核空间中的工作事实上非常有趣,中间还会穿插一些可抢占点,检测当前是否有进程可以调度,增加系统的实时性 初始化阶段: FD_set,把要监听的fd都添加到监听集合中去 监听/唤醒 阶段: 调用select() 通过系统调用,会把监听集合中所有fd都cop
阅读全文