随笔分类 -  电子-miniOS

摘要:问题 在学习串口子系统,在卸载串口模块的时候,引起内核崩溃。具体的崩溃日志如下: /mnt/uartdeep # rmmod virtual_uart.ko [ 23.208560] /home/book/bsp/mcu/uartdeep/virtual_uart_ok/virtual_uart.c 阅读全文
posted @ 2025-10-12 18:41 JwChu 阅读(19) 评论(0) 推荐(0)
摘要:重定位 文件组成 段是程序的组成元素,将程序分成一个一个程序段。为了便于区分,给每个段起名字,用于标记。在链接的时候,将这些段排布在合适位置。 程序的段名称: 代码段(.text):存放代码指令 只读数据段(.rodata):存放有初值并且const修饰的全局类变量(全局变量或static修饰的局部 阅读全文
posted @ 2022-08-10 19:06 JwChu 阅读(324) 评论(0) 推荐(0)
摘要:C文件的头文件及调用函数位置及gcc使用 C文件示例 #include<stdio.h>//头文件的作用? int main(int argc,char * *argv[]) { if(argc > 2){ printf(“HELLO, %s!\n”,argv[1]);//调用函数在哪里? } el 阅读全文
posted @ 2022-08-09 16:13 JwChu 阅读(847) 评论(0) 推荐(0)
摘要:Cortex-A 时钟系统 源时钟 进入控制器的时钟源头一般有两种:一个是RTC时钟,一个是外部时钟。 其中RTC时钟频率一般为:32.768KHz。外部时钟频率24M。 具体的外围电路: IMX6U的外设有很多,不同的外设需要不同的时钟。I.MX6U内部有7组时钟。而7组时钟都是来自24M晶振。具 阅读全文
posted @ 2022-08-06 21:30 JwChu 阅读(338) 评论(0) 推荐(0)
摘要:执行文件在存储设备的分布 文件内容 文件在存储介质中的地址,有存储地址与运行地址之分。顾名思义:运行地址是代码被执行过程中,代码的地址。存储地址是代码在存储介质中的地址。 而一个bin文件一般分为:text,data,bss,rodata四个段。这些内容在执行过程中,需要被链接到哪些地址上。需要有信 阅读全文
posted @ 2022-08-06 21:21 JwChu 阅读(136) 评论(0) 推荐(0)
摘要:Makefile规则 Makefile常见规则 目标文件:依赖文件 规则(命令) eg:maintest:main.o input.o output.o gcc -o maintest main.o input.o output.o 每条命令前面是由TAB键开始,不能使用空格。 Makefile的错 阅读全文
posted @ 2022-08-04 20:01 JwChu 阅读(70) 评论(0) 推荐(0)
摘要:互斥量 互斥量 通过将信号量设置为1,也可以实现信号量的互斥访问。在os中,提供一种专门的机制-互斥体,来进行互斥访问。 互斥体访问表示一次只有一个线程可以访问共享资源,不能递归申请互斥体。在互斥访问的场景尽量使用互斥体-mutex。 互斥体数据结构 互斥体数据结构文件:include/linux/ 阅读全文
posted @ 2022-07-31 16:11 JwChu 阅读(97) 评论(0) 推荐(0)
摘要:信号量 信号量的引入 对于操作共享空间时间较长的场景,对于自旋锁的使用不太合适,自旋锁适用于快速完成的场景。因为自旋锁会关闭抢占与中断。 在执行完成之后,在开启中断与抢占。对于不能快速完成,等待时间较长的的场景,不适用于自旋锁。由此引入信号量机制, 而信号量机制的引入的特点,信号量可以使线程进入休眠 阅读全文
posted @ 2022-07-30 21:28 JwChu 阅读(233) 评论(0) 推荐(0)
摘要:自旋锁 自旋锁概念 锁有自旋与睡眠两种。当进程无法获取锁资源,该进程不会休眠,会一直循环等待,一直到资源可用。 自旋锁接口函数 接口函数定义在include\linux\spinlock.h中,接口函数: 函数名 作用 spin_lock_init(_lock) 初始化自旋锁为unlock状态 vo 阅读全文
posted @ 2022-07-30 20:00 JwChu 阅读(284) 评论(0) 推荐(0)
摘要:原子操作 原子的引入 在上篇文章并发与竞争中,由于多线程对于共享变量的访问而引入的问题,不符合程序的期望。 为了规避这个问题,引入原子操作,对共享变量不能被打断。 原子操作有两种:原子变量,原子位。 原子变量内核操作 原子变量的内核文件:include/linux/types.h 图 1 原子变量数 阅读全文
posted @ 2022-07-30 19:58 JwChu 阅读(285) 评论(0) 推荐(0)
摘要:并发与竞争 并发与竞争的提出 对于全局变量区域,不同的任务(线程)可能会访问变量区的同一变量,这种对于同一内存访问的情况,就是并发情况。而对于这种并发的问题,会引入竞争。 int a = 1; a++; 对于全局变量int a,对于其操作加1操作。 并发与竞争机理 假设有两个或者两个以上的线程A,线 阅读全文
posted @ 2022-07-30 19:55 JwChu 阅读(58) 评论(0) 推荐(0)
摘要:定时器 定时器 定时器作为重要模块。是支持完成调度的基础之一。主要主要有两个方面:时间,动作。对应程序中的超时时间,函数。 在内核中使用定时器的接口函数: setup_timer(timer, fn, data):设置定时器,主要是初始化timer_list结构体,设置其中的函数、参数。 void 阅读全文
posted @ 2022-07-28 21:54 JwChu 阅读(296) 评论(0) 推荐(0)
摘要:阻塞与非阻塞 阻塞与非阻塞概念 阻塞:等待某件事情发生。如前面举例说明,使用read函数获取底层硬件数据,如果没有数据,会让任务休眠等待。 在使用poll方式,如果传入的等待时间不为0,任务是需要休眠等待的,也是阻塞的。 如果poll方式,将传入的等待时间为0,也即是不等待。没有数据立马返回,这是非 阅读全文
posted @ 2022-07-28 21:53 JwChu 阅读(282) 评论(0) 推荐(0)
摘要:异步 异步引入 前几章节提供的休眠-唤醒,poll机制,都需要休眠等待某个事件发生。但是在实际中,我们并不会休眠等待事件的发生, 而是采用另一种方式,等外部事件发生之后,将结果通知给我们。在程序中,就是驱动程序中的数据主动上报给App,App收到信号之后, 执行对应的动作。这种机制称为“异步机制”。 阅读全文
posted @ 2022-07-28 21:52 JwChu 阅读(85) 评论(0) 推荐(0)
摘要:Poll机制 Poll机制引入 休眠-唤醒机制来等待某个事件产生。完全取决的外部事件,可能等待的时间可能太长。为了避免等待时间过长, 增加超时时间,就是对应的poll机制。 具体流程: 使用poll机制,查询驱动程序是否有数据。 进入内核态,如果有数据,立刻返回 如果当时驱动中没有数据,内核程序进入 阅读全文
posted @ 2022-07-28 21:47 JwChu 阅读(275) 评论(0) 推荐(0)
摘要:休眠与唤醒 在中断的简介里面,介绍了四种模式:查询,休眠-唤醒,poll机制,异步通知机制。本节主要说休眠-唤醒机制。 举例:我们在等待按键被按下,可以使用“休眠-唤醒”机制。在应用程序中,等待按键事件发生。 1.APP使用read等操作函数尝试读取硬件底层数据。 2.APP调用read等函数,进入 阅读全文
posted @ 2022-07-28 21:44 JwChu 阅读(349) 评论(0) 推荐(0)
摘要:中断 中断的引入 MCU在按照顺序执行编译的代码(按照顺序次序执行)。对于外部的刺激,需要,MCU控制器需要对外部刺激,需要及时作出反应。 如果就是按照MCU顺序执行,有如下问题: 如果控制程序执行时间较长,不能及时响应外部刺激(前提是外部刺激持续足够时间)。 如果外部刺激持续时间较短,刺激马上消失 阅读全文
posted @ 2022-07-27 22:39 JwChu 阅读(1316) 评论(0) 推荐(0)
摘要:设备树驱动 设备树 设备树将是设备文件,后缀.dts。其用于描述板级设备,开发板的设备信息。(CPU数量,内存基地址,IIC控制器,SPI控制器)。设备树文件在linux内核文件中。 设备树文件格式 设备树源文件扩展名后缀.dts。设备树二进制文件后缀为.dtb。将dts编译为dtb文件,使用的工具 阅读全文
posted @ 2022-07-27 18:30 JwChu 阅读(1070) 评论(0) 推荐(1)
摘要:Plateform平台驱动架构 Plateform驱动平台必要性 对于比较简单的设备驱动,对IO进行最简单的读写操作,可以直接编写驱动代码就可以。对于比较复杂外设,考虑到驱动的可重用性,基于分离与分层的思想,抽象平台设备驱动。 驱动分层与分离 对复杂,成熟,庞大的操作系统,需要考虑代码的重用性。否者 阅读全文
posted @ 2022-07-27 00:01 JwChu 阅读(593) 评论(0) 推荐(0)
摘要:字符设备驱动(新API函数) 前言 之前的字符设备,采用register_chrdev与unregister_chedev完成驱动的注册与卸载,而且还需要手动创建设备节点,比较不方便。 目前可采用新的注册与卸载函数,完成驱动的注册与卸载。实现在驱动模块的加载过程中,完成自动创建设备节点。 设备号的申 阅读全文
posted @ 2022-07-26 17:42 JwChu 阅读(344) 评论(0) 推荐(0)