自学总结
文章平均质量分 59
远近长安
璀璨星河,伴我同行。
展开
-
哨兵节点:思想简单,效果很棒的编程算法
普通的算法哨兵算法小结。转载 2022-08-12 08:00:00 · 108 阅读 · 0 评论 -
UBI - Unsorted Block Images(未排序的块图像)(14-18)
UBI - Unsorted Block ImagesTable of contentsBig red note Overview Power-cuts tolerance Kernel source code Mailing list User-space tools UBI headers UBI volume table Implementation details Minimum flash input/output unit NAND flash sub-pag..翻译 2021-12-08 16:02:41 · 182 阅读 · 0 评论 -
1_5.5.5_字符设备驱动程序之查询方式的按键驱动程序_P
1原创 2021-07-21 00:09:56 · 157 阅读 · 0 评论 -
1_5.5.4_字符设备驱动程序之LED驱动程序_操作LED_P
在上一节的基础上修改代码,点亮led。目的:写一个点灯的驱动。框架; 完善硬件的操作 a.看原理图(确定引脚); b.看2440手册(确定配置); c.写代码:单片机:物理地址;驱动:虚拟地址(使用ioremap映射)配置:GPFCON open设置:GPFDAT write1.建立两个变量2.在加载时进行ioremap3.卸载时再unmap4.在open函数里面配置引脚5.在write函数里面设置引脚根据输入的数据控...原创 2021-07-18 23:49:36 · 272 阅读 · 2 评论 -
1_5.5.3_字符设备驱动程序之LED驱动程序_测试改进_P
使用cat /proc/devices查看目前内核支持的字符类设备。将编译好的first_drv.ko推到挂接的目录下。使用insmod命令来加载,有一条提示信息,暂时不管。然后再cat /proc/devices查看一下,发现已经注册进来了,这里的主设备号是252,因为我在程序里使用的是自动分配,所以给分了一个255以下最大的未使用设备号。编写一个firstdrivertest.c文件,生成可执行文件并推到挂接的目录来测试一下。显然open失败,因为...原创 2021-07-17 12:24:40 · 177 阅读 · 0 评论 -
signal()函数
描述该函数是一个C库函数,原型为void(*signal(int sig, void(*func)(int)))(int);解读void (*signal(int sig, void (*func)(int)))(int)首先,void(*func)(int)表示的是一个函数指针,且该函数带有一个int型参数,返回值为void。然后,signal(int sig, void (*func)(int)),表示signal函数有两个参数,第一个参数为一个int型变量,第二个是一个函数指针.转载 2021-06-24 14:04:18 · 1214 阅读 · 0 评论 -
1_5.1.1_U-boot分析与使用_u-boot分析之编译体验_P
下面开始新一期到第二期之间的衔接视频的学习。window操作系统上,系统的启动流程是这样的:启动BIOS;引导windows操作系统;识别C,D盘等;运行应用程序,如QQ,MSN等;类似的,嵌入式操作系统的启动流程是这样的:bootloader(常用u-boot)引导Linux内核;挂接根文件系统;启动应用程序;其中BootLoader对应BIOS,最终目的是启动内核。使用u-boot-1.1.6.tar.bz2来体验编译uboot,需要u-boot-1.1.6_jz2440原创 2021-05-12 00:03:13 · 206 阅读 · 2 评论 -
1_5.5.1_字符设备驱动程序之概念介绍_P
之前讲了uboot,它的任务是启动内核;内核的任务是启动应用程序;应用程序,里面肯定会涉及很多文件操作,比如读写文件,还有很多硬件操作,比如点灯,获取按键值等。对于写应用程序的人,他们通常不会去查看芯片手册看这些硬件要怎么操作,而是直接调用open,read,write这些接口来调用底层驱动。最简单的一种对应方法就是,open函数,read函数,write函数分别会来调用底层驱动的led_open函数,led_read函数,led_write函数。现在我们来看一下,应用程序的open,read这原创 2021-05-02 01:27:09 · 153 阅读 · 0 评论 -
1_5.4.4_根文件系统_构建根文件系统之构建根文件系统_P
根据下面五项创建根文件系统:/dev/console,/dev/null;init ⇒ busybox;/etc/inittab;配置文件中指定的程序;C库。/dev/console,/dev/null首先先创建/dev/console和/dev/null两个设备,先看一下在PC机中这两个设备的描述。(各种设备都以文件的形式存在/dev目录下,称为设备文件)crw中的C表示是字符类设备,5为主设备号,然后1是次设备号。(在嵌入式系统中,一个字符设备或者块设备都有一个主设备号和次设备号,主原创 2021-05-02 00:56:28 · 228 阅读 · 0 评论 -
1_5.4.3_根文件系统_构建根文件系统之busybox_P
构建根文件系统之前,先来编译一下busybox。原创 2021-04-17 23:17:29 · 131 阅读 · 0 评论 -
[LeetCode] 118. 杨辉三角
题目题目如下图所示。提供的代码如下:/** * Return an array of arrays of size *returnSize. * The sizes of the arrays are returned as *returnColumnSizes array. * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free(). */int** ge原创 2021-04-17 17:12:36 · 132 阅读 · 0 评论 -
1_5.4.2_根文件系统_构建根文件系统之init进程分析_P
1原创 2021-04-17 11:48:43 · 184 阅读 · 0 评论 -
1_5.4.1_根文件系统_构建根文件系统之启动第1个程序_P
u-boot的目的是:启动内核;内核的目的是:启动应用程序,应用程序又位于根文件系统;构建:根文件系统。如果理解了以上三步,就可以从无到有在一个单板上搭建出一个根文件系统来。内核的目的是:启动应用程序。那么应用程序有那么多,到底启动哪一个应用程序呢?上一节有说过,是在init_post函数里面启动应用程序的。那么,内核怎么启动第1个应用程序?首先,打开一个设备,open(/dev/console),然后sys_dup(0);sys_dup(0);这三句话是什么意思呢?我们写程序时经常会原创 2021-04-07 00:20:48 · 139 阅读 · 0 评论 -
1_5.3.4_内核配置裁剪及启动流程_内核启动流程分析之内核启动_P
内核的最终目的:运行应用程序(在根文件系统里面,需要挂接根文件系统)。一下运行应用程序前要做什么事情?1.处理u-boot传入的参数从第一个文件(arch/arm/kernel/head.S)开始分析。查找head.S,发现还有一个boot\compressed目录下的head.S文件,这是什么文件呢?我们编译出来的内核可能会很大,有没有办法让它变小一点呢?答:有的,使用压缩将文件变小。在压缩后的文件前面加上一个自解压代码。本来代码是从原来的文件开始运行,现在使用压缩后的文件,代码就从自解压原创 2021-04-06 23:53:07 · 105 阅读 · 0 评论 -
windows无法修改samba共享文件
使用chmod -R 777 +分享的文件夹,给所有文件设置可读可写可执行的权限。原创 2021-04-06 16:28:41 · 1304 阅读 · 0 评论 -
1_5.3.3_内核配置裁剪及启动流程_内核启动流程分析之Makefile_P
分析Makefile,主要是:找到第1个文件,从这个文件入手分析启动流程;链接脚本,分析文件分布情况。涉及的文件分类如下:kbuild Makefile首先来看子目录下面的Makefile,也就是kbuild Makefile,每个子目录下面都会有一个Makefile,它们的主要功能是设置该目录的文件的编译选项。选取一个子目录下的Makefile来研究一下。其中大部分的内容是设置文件的编译选项。假设有两个文件a.c和b.c,如果需要单独的将它们编译进内核,可以使用如下语句:obj原创 2021-04-05 10:13:14 · 193 阅读 · 2 评论 -
1_5.3.2_内核配置裁剪及启动流程_内核启动流程分析之配置_P
配置结果:生成一个.config文件。以配置项:CONFIG_DM9000为例。使用vim打开.config,搜索DM9000,可以看到CONFIG_DM9000=y,表示编译内核时DM9000会被链接,编入内核。有一些参数等于m,表示编译后作为模块,不编入内核但可以动态加载这个模块。使用grep “CONFIG_DM9000” * -nwR指令在全部文件中搜索CONFIG_DM9000。可以看到,在以下四种地方可以搜索到CONFIG_DM9000。C源码:CONFIG_DM9000(主原创 2021-04-04 18:31:09 · 107 阅读 · 2 评论 -
1_5.3.1_内核配置裁剪及启动流程_内核启动流程分析之编译体验_P
使用linux-2.6.22.6版本,补丁为官方提供的2440补丁。解压缩:tar -jxvf linux-2.6.22.6.tar.bz2打补丁:patch -p? < 补丁文件配置编译其中,配置主要有三种方法:make menuconfig,自己手动配置(太复杂);使用默认配置,在上面修改;使用厂家提供的配置;使用默认配置的话,默认配置是什么呢?在arch/arm/configs目录下,找到相似的配置文件xxx_defconfig,然后执行make xxx_defcon.原创 2021-04-04 16:10:04 · 125 阅读 · 0 评论 -
加速u-boot启动内核速度
u-boot启动内核时,要先将内核从Flash拷到SDRAM,中间的过程大约需要7s,通过ICACHE可以加速这个过程。icache就是指令的高速缓冲存储器,CPU从ICache获取指令,比从外部的Flash或者SDRAM获取都要快得多。在2440中,有MCU,MCU外还接有ICache和DCache(使用的前提是要启动MMU),当我们不使用ICache时,CPU每次执行都需要从SDRAM中取代码;当使用ICache时,CPU会将从SDRAM中取到的一小块指令放在ICache,当要取指令时会先从ICa原创 2021-04-04 14:54:36 · 638 阅读 · 0 评论 -
1_5.1.6_U-boot分析与使用_uboot启动内核_P
现在来分析uboot是怎么启动内核的。我们知道,u-boot启动内核是通过两条指令来实现的。nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0读出内核nand read.jffs2 0x30007FC0 kernel从kernel中读出内核,放到地址0x30007FC0去。分区:对于windows系统来说,每个硬盘上都有分区表;对于嵌入式Linux来说,Flash没有分区表,但是我们可以人为的将这块Flash分为几个区,这些分区没有分区表,而原创 2021-03-30 21:02:55 · 206 阅读 · 0 评论 -
1_5.1.5_U-boot分析与使用_u-boot分析之u-boot命令实现_P
使用u-boot的命令,首先就是输入一个命令(字符串),然后回车,u-boot接收到命令之后就会执行相应的动作(函数)。猜测是u-boot中有一个命令结构体,里面包含了命令的name和fun,run_command()函数就是在这个结构体里面查找命令并调用对应的函数。下面来分析一下run_command()函数。下图是指令解析,通过注释可以知道,可以在同一行输入两个命令,两个命令用;隔开即可。可以看到,输入print; md.w 0,u-boot依次执行了print操作和md.w 0操作。然后是原创 2021-03-29 23:12:12 · 149 阅读 · 0 评论 -
1_5.1.3_U-boot分析与使用_u-boot分析之源码第1阶段_P
我们以前写裸机程序时:初始化:关看门狗,初始化时钟,初始化SDRAM;把程序从nand拷贝到SDRAM;设置sp;uboot作为一个裸机程序的集大成者,这些都会做,而且还要读出内核并启动内核。之前分析过,uboot上电会先调用cpu/arm920t/start.S,我们就从这个文件来入手分析。从上到下分析,start.S做了这些操作设为SVC模式;关看门狗;屏蔽中断;初始化SDRAM;设置栈;时钟配置;重定位,代码从Flash拷到SDRAM;清bss段;调用start_a原创 2021-03-29 15:27:18 · 98 阅读 · 0 评论 -
1_5.1.2_U-boot分析与使用_u-boot分析之Makefile结构分析_P
我们分析一个文件的时候,最好的方式就是看它的makefile。之前体验编译uboot时,我们第一步是配置uboot,第二步是编译。分析配置uboot指令配置uboot使用的指令是make 100ask24x0_config。首先找到Makefile,用Notepad++打开,查找100ask24x0_config,定位如下:那么make 100ask24x0_config其实就是执行@$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3原创 2021-03-29 10:35:59 · 131 阅读 · 2 评论 -
1.13.7_前期编程_系统时间与环型缓冲区_P
系统时间首先设置一个变量记录系统时间,为了防止溢出使用的是unsigned long long的数据类型,取值范围是0~2^64,计算得到,需要运行50几亿年才会溢出。在定时器中断中累加这个值,可以通过get_system_time_us函数获取系统时间。每来一个时钟脉冲(0.2us一个时钟脉冲)计数器减1,再和系统时间变量结合就可以得到us级的系统时间了。环型缓冲区假设有一个char类型的数组,最多保存6个char数据,设置一个读变量r,它表示下一个读元素的下标,设置一个写变量w,它表示下原创 2021-03-27 23:36:32 · 98 阅读 · 0 评论 -
1.13.2_高精度延时函数_P
在使用某些设备时,对延时时间的精度有很高的要求,这时候,就可以使用高精度的延时函数来实现精准延时。实现方法实现高精度的延时函数的方法主要有以下两种。使用for循环在for循环中循环自减,为0跳出,以此来实现延时;这种方法实现难度较高,需要不断测试才能确定一个比较精确的值,且移植性能很差(同样程序,比如在Nor和SDRAM上运行,花费的时间将不同,不同款的SDRAM设备,花费的时间又会不同)。使用定时器使用芯片内部的定时器可以实现微秒级的精准计时。假设有一个定时器,设置一个初始值,每来一个CL原创 2021-03-27 19:59:04 · 255 阅读 · 0 评论 -
1.11.1_SPI_SPI协议介绍_P
SPI主要有四根线,分别是信号线SCLK,主机输入从机输出MISO,主机输出从机输入MOSI,以及一个片选信号/CS。SPI通信还支持全双工通信,即可以同时接受和发送数据,因为MISO和MOSI是两条不同的线。SPI同样支持连接多台设备,但是要分时操作,当操作某台设备时,将这个设备的片选引脚拉低表示选中,完成操作后再释放引脚。所有设备的时钟线和两条数据线则是共用的,只是通过片选引脚来决定何时使用何设备。SPI支持四种不同的传输模式,分别是SPI MODE0,1,2,3,我们经常使用的是MODE0和3原创 2021-03-27 15:52:23 · 847 阅读 · 0 评论 -
1.10.7_I2C_测试_P
测试总结:中断没产生:未配置GPIO用于IIC功能;只产生一次中断,并且出错:tx err, no ack:启动传输前,IICSTAT = (1<<4);第一次读OK,再次写卡死,复位仍然卡死,重新上电再写OK:查看AT24cxx芯片手册,读最后一个数据时,不要回应ACK给AT24cxx。...原创 2021-03-27 02:15:00 · 119 阅读 · 0 评论 -
1.10.6_I2C_EEPROM编程和测试代码_P
根据AT24cxx手册,可以得到地址信息,还需要对照2440的原理图查看A0,A1,A2分别接到哪个引脚。由于AT24cxx在SPI模块上,而SPI模块目前停售,所以本节只编写一个可以正常运行的程序,了解原理和使用过程即可。根据AT24cxx的原理图可以看到,使用的型号是AT24C02A,其中A0,A1,A2都接到地(原理图略)。所以使用的是2K(256字节,256bytes*8=2048bits)大小的EEPROM设备,设备地址为0x50(写)或0x51(读),最低位为读写标志位,IIC协议规定原创 2021-03-27 00:54:43 · 174 阅读 · 0 评论 -
1.10.5_I2C_I2C控制器编程_中断_P
中断程序是I2C控制器核心和核心,ACK的确认就是在中断程序中完成的。中断的处理流程时通过2440的相关流程图和AT24cxx的数据结构来完成的。下图是2440 IIC控制器处于Transmitter模式的流程图和AT24cxx写数据的结构体图。由发送函数开启发送。对于第一个中断,发送的是地址,如果没有收到ACK,说明设备不存在,则直接停止传输。如果有数据,则正常进行写操作,直到数据都写完。读数据的流程图也类似。同样是从一个读函数开启。然后在中断函数中处理,第一个也是设备地址,没有ack则原创 2021-03-26 17:59:02 · 1228 阅读 · 0 评论 -
1.10.4_I2C_I2C控制器编程_框架_P
下图是I2C Transmitter模式下的流程图。下图是I2C Receiver模式下的流程图。原创 2021-03-24 23:47:30 · 102 阅读 · 0 评论 -
1.10.3_I2C_程序框架_P
下面介绍一下I2C程序的框架。IIC控制器不知道数据的含义,它只负责数据的传输,主要是读和写功能的实现。下图是IIC传输数据的结构。下图是AT24cxx的写时序图。下图是AT24cxx的读时序图。我们的程序应该分为两层,上层是I2C设备,比如AT24cxx,下层是I2C控制器,比如2440。I2C控制器有很多种,比如2440的I2C控制器,Ti的I2C控制器,他们都分到下层的I2C控制器一层,上层的I2C设备则将I2C的功能进行封装,这样在使用不同芯片的I2C控制器时,我们就直接通过调用设备函数原创 2021-03-22 14:22:26 · 180 阅读 · 0 评论 -
1.10.2_I2C_S3C2440的I2C控制器_P
2440通过I2C总线连接设备(AT24Cxx),芯片内部有一个I2C控制器。当主机(2440)Master为Transmitter时,从机Slave为Receiver,当主机Master为Receiver时,从机Slave为Transmitter。下图是2440的I2C总线框图。从左往右看,首先是I2C的时钟,I2C的时钟源是PCLK(50MHz),经过一个4bit的分频器,产生I2C的时钟。通过IICSTAT寄存器发出信号,通过IICDS发送数据或接受数据。数据的传输格式如下图如所示。首先发出开.原创 2021-03-21 01:23:26 · 203 阅读 · 0 评论 -
ucos ii统计各个任务栈使用情况
1.创建一个统计任务如下图所示,创建一个统计任务,任务命名为“stat”。该任务优先级设为最高。2.在统计任务中统计各个任务的栈使用情况统计了已使用和未使用的栈空间以及栈使用率。3.实测结果如下...原创 2021-03-18 16:43:29 · 557 阅读 · 0 评论 -
1.10.1_I2C_I2C协议与EEPROM_P
在2440开发板上,有两个接口SCL和SDA,其中SCL是时钟线,SDA是数据线,他们分别连接一个上拉电阻(控制SDA的电平和SCK电平),这两条线上挂载了许多设备,这些设备也有两条线,分别连接ARM的SCL和SDA。那么我们怎么传输数据?比如说和一个存储芯片连接,我们需要把数据发给它,也要从芯片里读取数据。假设有一个老师和ABCD四个学生,假设老师要发球,那么他会这样做。老师会告诉学生说,注意我要发球了(start)然后老师会申明这个球要发给哪个学生,比如发给A,老师会说,A,我要把球给你了.原创 2021-03-15 11:09:25 · 241 阅读 · 0 评论 -
1.9.10_ADC和触摸屏_较准与画线编程_P
上一节得到了触摸屏和LCD坐标关于x轴和y轴的转换公式,其中主要是获取两个长度比例Kx和Ky。原创 2021-03-14 20:05:06 · 217 阅读 · 0 评论 -
1.9.9_ADC和触摸屏_较准原理_P
1原创 2021-03-03 01:08:23 · 269 阅读 · 0 评论 -
1.9.7-8_ADC和触摸屏_定时器程序优化_使用定时器支持长按_P
之前的程序虽然可以实现触点坐标的采集,但是不支持长按和滑动,要想支持长按和滑动,需要使用定时器来定时采集。在按下的时候启动定时器,在定时器中断中采集触点坐标的AD值,如果定时器中断中检测到触摸屏已经松开,则关闭中断并进入等待按键按下模式,否则在定时器中断中循环采集坐标的AD值。...原创 2021-02-16 15:26:26 · 139 阅读 · 0 评论 -
1.9.6_ADC和触摸屏_ADC中断_P
1原创 2021-02-10 17:13:23 · 291 阅读 · 0 评论 -
1.9.5_ADC和触摸屏_按下松开检测_P
程序的流程如上图所示,其他主要是代码。原创 2021-02-04 21:58:39 · 305 阅读 · 2 评论 -
1.9.4_ADC和触摸屏_S3C2440触摸屏接口_P
从上节内容可以知道,检测触摸屏按下和计算触点坐标是通过S1到S5五个开关来完成的,通过控制五个开关在不同时候的关断与闭合就可以得到触点的XY坐标。通过2440的芯片手册来查看触摸屏是怎么工作的。首先,通过8:1的多路选择器我们可以选择控制哪路通道。然后是触摸屏的接口模式:正常转换模式。用于常规的ADC转换,通过设置ADCCON来初始化ADC,通过读写ADCDAT0来完成转换。分离的X/Y转换模式。逐个测量X/Y坐标,X坐标保存在ADCDAT0,并且会产生中断,Y坐标保存在ADCDAT1中,原创 2021-02-02 23:40:28 · 314 阅读 · 0 评论