自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(64)
  • 收藏
  • 关注

原创 ARM 架构及汇编

文章目录1.ARM 架构及汇编1.1 ARM架构1.2 几条汇编指令1.3 函数运行的本质1.ARM 架构及汇编1.1 ARM架构ARM芯片属于精简指令集计算机(RISC:Reduced Instruction Set Computor),它所用的指令比较简单,有如下特点:① 对内存只有读、写指令② 对于数据的运算是在CPU内部实现③ 使用RISC指令的CPU复杂度小一点,易于设计cpu访问硬件设备,会发出地址addr,会得到数据比如对于a=a+b这样的算式,需要经过下面4个步骤才可以实现:

2022-04-25 16:42:41 2960 1

原创 linux相关gpio函数

/home/ysy/linux/IMX6ULL/linux/linux-imx-rel_imx_4.1.15_2.1.0_ga/include/linux/gpio.hstatic inline int gpio_direction_output(unsigned gpio, int value){ return -ENOSYS;}/home/ysy/linux/IMX6ULL/linux/linux-imx-rel_imx_4.1.15_2.1.0_ga/include/asm-generi

2022-04-20 21:50:01 647

原创 RTOS的引入

文章目录1. RTOS 概念及线程的引入1.1 RTOS的概念1.1.1 用人来类比单片机程序和RTOS1.1.2 RTOS程序简单示例1.1.3 前后台程序简单示例1. RTOS 概念及线程的引入1.1 RTOS的概念1.1.1 用人来类比单片机程序和RTOS妈妈要一边给小孩喂饭,一边加班跟同事微信交流,怎么办?对于单线条的人,不能分心、不能同时做事,她只能这样做:给小孩喂一口饭瞄一眼电脑,有信息就去回复再回来给小孩喂一口饭如果小孩吃这口饭太慢,她回复同事的信息也就慢了,被同事催:你

2022-04-20 09:06:32 315

原创 Markdown快速入门

Markdown快速入门代码块:妈妈要一边给小孩喂饭,一边加班跟同事微信交流,怎么办?//代码块语法:```c1.c代码struct irq_keydesc {39 int gpio; /* gpio */40 int irqnum; /* 中断号 */41 unsigned char value; /* 按键对应的键值 */42 char name[10]; /* 名字 */43 irqreturn_t (*handler)(int, void *); /* 中断服务函数 */

2022-04-18 13:44:19 177

原创 linux下的gpiod_get和gpiod_get_index

#define __gpiod_get(dev, con_id, flags, ...) __gpiod_get(dev, con_id, flags)#define gpiod_get(varargs...) __gpiod_get(varargs, GPIOD_ASIS)#define __gpiod_get_index(dev, con_id, index, flags, ...) \ __gpiod_get_index(dev, con_id, index, flags)#define g

2022-04-16 20:49:49 2042 1

原创 platform_get_resource

platform_get_resource 这个函数跟设备树没什么关系,但是设备树中的节点被转换为platform_device后,设备树中的reg属性、interrupts属性也会被转换为“resource”。这时,你可以使用这个函数取出这些资源。一 个 节 点 能 被 转 换 为 platform_device , 如 果 它 的 设 备 树 里 指 定 了 中 断 属 性 , 那 么 可 以 从platform_device 中获得“中断资源”,函数如下,可以使用下列...

2022-04-16 13:49:57 2399 1

原创 LINUX下浮点运算

在内核中尽量不要使用浮点运算,所以不要在驱动将原始值转换为对应的实际值,因为会涉及到浮点计算。可以在应用程序中在计算,如果测试APP 中用到了浮点计算,而 I.MX6U 是支持硬件浮点的,因此我们在编译 icm20608App.c 的时候就可以使能硬件浮点,这样可以加速浮点计算。使能硬件浮点很简单,在编译的时候加入如下参数即可:-march-armv7-a -mfpu-neon -mfloat=hard输入如下命令使能硬件浮点编译 icm20608App.c 这个测试程序:arm-linu.

2022-04-14 14:07:07 1211

原创 linux下的msleep(),mdelay函数解析

sleep()函数:static inline void ssleep(unsigned int seconds){ msleep(seconds * 1000);}msleep函数:void msleep(unsigned int msecs){ unsigned long timeout = msecs_to_jiffies(msecs) + 1; while (timeout) timeout = schedule_timeout_uninterruptible(t

2022-04-11 19:58:17 4246

原创 驱动·错误

make -C /home/ysy/linux/IMX6ULL/linux/linux-imx-rel_imx_4.1.15_2.1.0_ga M=/home/ysy/linux/100ask/02_sr501_chrdev_probe_read_irq modulesmake[1]: Entering directory '/home/ysy/linux/IMX6ULL/linux/linux-imx-rel_imx_4.1.15_2.1.0_ga' CC [M] /home/ysy/linux/..

2022-04-05 17:07:30 1641

原创 Linux环境变量设置/etc/profile、/etc/bashrc、~/.profile、~/.bashrc区别

登入系统读取步骤: 当登入系统时候获得一个shell进程时,其读取环境设定档有三步 : 1.首先读入的是全局环境变量设定档/etc/profile,然后根据其内容读取额外的设定的文档,如 /etc/profile.d和/etc/inputrc 2.然后根据不同使用者帐号,去其家目录读取~/.bash_profile,如果这读取不了就读取~/.bash_login,这个也读取不了才会读取~/.profile,这三个文档设定基本上是一样的,读取有优先关系 3.然后在根据用户帐

2022-03-28 13:48:04 382

原创 哪些设备树节点会被转换为 platform_device以及获取中断号

写驱动程序的时候,需要把驱动分为平台device和平台driver两部分。在平台device中会放入硬件所使用的资源,使用C代码来指定platform_device,当需要修改硬件资源时,比如说想去修改led的引脚时,需要重新修改C文件,重新编译内核。再后来我们使用了设备树,可以在设备树中指定硬件资源。设备树是dts文件,它会转换成dtb文件,最终给内核使用。内核会来解析dtb文件得到一系列的device_node,最后一步,将device_node转换成platform_device....

2022-03-28 11:17:14 1129

原创 字节、半字、字

定义字是根据处理器的特性决定的。首先ARM是32bit处理器,所以它的字是32bit的。半字自然就是16bit;字节不论在哪个CPU上都是8bit。如果在MSP430上,由于它是16bit处理器,所以它的字是16bit的。半字=字节=8bit。CPU按照其处理信息的字长可以分为:八位微处理器、十六位微处理器、三十二位微处理器以及六十四位微处理器等。在32位处理器中:B:一个字节,也叫字节;H:2个字节,也叫半字;W:4个字节,也...

2021-10-30 10:56:43 1391 1

原创 linux下的link函数和unlink函数

inode 其本质为结构体,存储文件的属性信息。如:权限、类型、大小、时间、用户、盘块位置……也叫作文件属性管理结构,大多数的 inode 都存储在磁盘上。 少量常用、近期使用的 inode 会被缓存到内存中。 dentry 目录项,其本质依然是结构体,重要成员变量有两个 {文件名,inode,...},而文件内容(data)保存在磁盘盘块中。思考,为什么目录项要游离于 inode 之外,画蛇添足般的将文件名单独存储呢??这样 的...

2021-10-19 15:29:57 1046

原创 linux下的stat/lstat函数

Linux 下可以使用 stat 命令查看文件的属性,其实这个命令内部就是通过调用 stat()函数来获取文件属性的,stat 函数是 Linux 中的系统调用,用于获取文件相关的信息,函数原型如下所示(可通过"man 2 stat"命令查看): #include <sys/types.h>#include <sys/stat.h>#include <unistd.h>int stat/lstat(const char *pathname, struct s

2021-10-19 09:52:52 703

原创 软连接和硬连接(Linux创建软连接一定要用绝对路径)

一、Linux连接文件Linux有两种连接文件:符号连接(软连接)和硬链接,符号链接类似Windows下的快捷方式。硬链接通过文件系统的inode连接来产生新文件名,而不是产生新文件。inode:记录文件属性,一个文件一个inode。inode相当于文件ID,查找文件的时候要先找到inode,然后才能读出文件的内容。二、ln命令ln命令用于创建连接文件:ln[选项] 源文件 目标文件选项:-s创建符号链接(软连接)ln 源文件 目标文件(不需要参数,是硬连接)-f...

2021-10-18 17:02:31 3057 1

原创 传入参数和传出参数

传入参数: 1. 指针作为函数参数。 2. 同常有const关键字修饰。 3. 指针指向有效区域, 在函数内部做读操作。char *strcpy(char *dest, const char *src)中的const char *src传出参数: 1. 指针作为函数参数。 2. 在函数调用之前,指针指向的空间可以无意义,但必须有效。 3. 在函数内部,做写操作。 4。函数调用结束后,充当函数返回值。char *...

2021-10-16 10:29:05 853

原创 linux下的lseek函数

对于每个打开的文件,系统都会记录它的读写位置偏移量,我们也把这个读写位置偏移量称为读写偏移量,Linux 中可使用系统函数 lseek 来修改文件偏移量(读写位置)#include <sys/types.h>#include <unistd.h>off_t lseek(int fd, off_t offset, int whence);fd:文件描述符。 offset:偏移量,以字节为单位。 whence:用于定...

2021-10-16 10:09:28 7581

原创 .ko文件的编译生成

1 KERNELDIR := /home/ysy/linux/IMX6ULL/linux/linux-imxrel_imx_4.1.15_2.1.0_ga_alientek2 CURRENT_PATH := $(shell pwd)3 obj-m := chrdevbase.o4 5 build: kernel_modules6 7 kernel_modules: 8 $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules9 clean:10 .

2021-10-14 09:09:29 3637

原创 全局变量和静态局部变量初始值为0放在bss段

.bss段是放未初始化或者初始化为0的全局变量; .data段是存放初始了且不为零的全局变量。bss段中的值全部赋为了0。程序中就不存在没有初始化的全局变量了,你不初始化,bss段也会帮你初始化为0。...

2021-10-09 10:01:30 760

原创 全局变量和局部变量初始值

1、全局int变量(包括有static前缀的)未初始化, 默认值是0。2、局部int变量未初始化,默认值未知。(除了加static 前缀的局部变量,因为此时的局部变量是放在静态存储区内的,跟全局变量一样)解释:局部变量是存在栈中,数据量大,且生命周期短,若为局部变量进行初始化,开销很大。-------所以,我们在定义局部变量的时候,最好直接初始化...

2021-10-09 09:59:44 1899

原创 linux系统下fcntl函数解析

fcntl()函数可以对一个已经打开的文件描述符执行一系列控制操作,譬如复制一个文件描述符(与 dup、dup2 作用相同)、获取/设置文件描述符标志、获取/设置文件状态标志等,类似于一个多功能文件描述符管理工具箱。fcntl()函数原型如下所示(可通过"man 2 fcntl"命令查看): #include <unistd.h>#include <fcntl.h>int fcntl(int fd, int cmd, ... /* arg */ )...

2021-10-08 10:39:10 1162

原创 linux下的阻塞和非阻塞

#include <unistd.h>#include <fcntl.h>#include <errno.h>#include <stdio.h>#include <stdlib.h>#include <string.h>int main(void){ char buf[10]; int fd, n; fd = open("/dev/tty", O_RDONLY|O_NONBLOCK); if (fd &l.

2021-10-08 10:15:17 2244

原创 使用read write 函数实现简单的 cp 功能。

#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <stdio.h>#include <string.h>#include <stdlib.h>int main(int argc, char *argv[]){ int fd1,fd2; int n = 0; char buf.

2021-09-30 09:05:22 392

原创 静态库与动态库

gcc编译: 4步骤: 预处理、编译、汇编、连接。 -I: 指定头文件所在目录位置。 -c: 只做预处理、编译、汇编。得到 二进制 文件!!! -g: 编译时添加调试语句。 主要支持 gdb 调试。 -Wall: 显示所有警告信息。 -D: 向程序中“动态”注册宏定义。 #define NAME VALUE静态库制作及使用步骤: 1. 将 .c 生成 .o 文件 gcc -c add....

2021-09-24 15:30:42 68

原创 标准c库的fopen函数

在文件 I/O 中,使用 open()系统调用打开或创建文件,而在标准 I/O 中,我们将使用库函数 fopen()打开或创建文件,fopen()函数原型如下所示: #include <stdio.h>FILE *fopen(const char *path, const char *mode);使用该函数需要包含头文件 stdio.h。 函数参数和返回值含义如下: path:参数 path 指向文件路径...

2021-09-18 11:08:18 1149

原创 标准 I/O 库

1 标准 I/O 库简介所谓标准 I/O 库则是标准 C 库中用于文件 I/O 操作(譬如读文件、写文件等)相关的一系列库函数的集合,通常标准 I/O 库函数相关的函数定义都在头文件<stdio.h>中,所以我们需要在程序源码中包含<stdio.h>头文件。标准 I/O 库函数是构建于文件 I/O(open()、read()、write()、lseek()、close()等)这些系统调用之上的,譬如标准 I/O 库函数 fopen()就利用系统调用 open()来...

2021-09-17 10:39:50 328

原创 linux之文件共享

什么是文件共享?所谓文件共享指的是同一个文件(譬如磁盘上的同一个文件,对应同一个 inode)被多个独立的读写体同时进行 IO 操作。多个独立的读写体大家可以将其简单地理解为对应于同一个文件的多个不同的文件描述符,譬如多次打开同一个文件所得到的多个不同的 fd,或使用 dup()(或 dup2)函数复制得到的多个不同的 fd 等。同时进行 IO 操作指的是一个读写体操作文件尚未调用 close 关闭的情况下,另一个读写体去操作文件,前面给大家编写的示例代码中就已经涉...

2021-09-16 16:08:40 678 1

原创 GPT定时器简介

一、GPT定时器简介以前的延时函数就采用空指令执行来实现,延时肯定不准确!当我们修改了6ULL的主频以后,采用空指令的延时函数就不准了!因此我们需要高精度的延时函数,而且不随着主频的变化而改变。STM32使用SYSTICK这个硬件定时器来实现高精度延时,因此我们可以在6U里面使用一个硬件定时器来实现高精度延时。本讲我们使用6U的GPT定时器来实现高精度延时。GPT定时器是32位向上计数器。GPT定时器有捕获的功能。GPT定时器支持比较输出或中断功能。GPT定时器有一个12位的分频器。GPT时

2021-09-16 14:07:41 798

原创 EPIT寄存器

一、EPIT简介1、EPIT是32位的一个向下计数器。2、EPIT的时钟源可以选择,我们选择ipg_clk=66MHz。3、可以对时钟源进行分频,12位的分频器,04095分别代表14096分频。4、开启定时器以后,计数寄存器会每个时钟减1,如果和比较寄存器里面的值相等的话就会触发中断。EPIT有两种工作模式: Set-add-forget,free-runingset-and-forget 模式:EPITx_CR(x=1,2)寄存器的 RLD 位置 1 的时候 EPIT 工作在此模式下,在此模

2021-09-16 14:04:22 695

原创 EPIT定时器

**1.什么是EPIT定时器:**EPIT 的全称是:Enhanced Periodic Interrupt Timer,直译过来就是增强的周期中断定时器,它主要是完成周期性中断定时的。学过 STM32 的话应该知道,STM32 里面的定时器还有很多其它的功能,比如输入捕获、PWM 输出等等。但是 I.MX6U 的 EPIT 定时器只是完成周期性中断定时的,仅此一项功能!至于输入捕获、PWM 输出等这些功能,I.MX6U 由其它的外设来完成。**2.EPIT的特性:EPIT是一个32位向下计数器

2021-09-16 14:02:37 446

原创 Linux 系统如何管理文件

1 静态文件与 inode文件在没有被打开的情况下一般都是存放在磁盘中的,譬如电脑硬盘、移动硬盘、U 盘等外部存储设备,文件存放在磁盘文件系统中,并且以一种固定的形式进行存放,我们把他们称为静态文件。 文件储存在硬盘上,硬盘的最小存储单位叫做“扇区”(Sector),每个扇区储存 512 字节(相当于 0.5KB),操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个“块”(block)。这种由多个扇区组成的“...

2021-09-14 15:43:39 94

原创 Linux 多点电容触摸屏实验(1)

1.多点电容触摸简介ATK-7016 这款屏幕其实是由 TFT LCD+触摸屏组合起来的。底下是 LCD 面板,上面是触摸面板,将两个封装到一起就成了带有触摸屏的 LCD 屏幕。电容触摸屏也是需要一个驱动 IC的,驱动 IC 一般会提供一个 I2C 接口给主控制器,主控制器可以通过 I2C 接口来读取驱动 IC里面的触摸坐标数据。ATK-7016、ATK-7084 这两款屏幕使用的触摸控制 IC 是 FT5426,ATK- 4342 使用的驱动 IC 是 GT9147。这...

2021-09-10 09:36:35 1227

原创 Linux RS232/485/GPS 驱动实验(4)-minicom移植

minicom 类似我们常用的串口调试助手,是 Linux 下很常用的一个串口工具,将 minicom移植到我们的开发板中,这样我们就可以借助 minicom 对串口进行读写操作。 1、移植 ncurses minicom 需要用到 ncurses,依次需要先移植 ncurses,如果前面已经移植好了 ncurses,那么 这里就不需要再次移植了,只需要在编译 minicom 的时候指定 ncurses 库和头文件目录 即可。 首先在 ubuntu 中 创 建 一 个 目 录 来 存 放

2021-08-09 19:12:23 803

原创 Linux RS232/485/GPS 驱动实验(3)-设备树修改

1、UART3 IO 节点创建 UART3 用到了 UART3_TXD 和 UART3_RXD 这两个 IO,因此要先在 iomuxc 中创建 UART3 对应的 pinctrl 子节点,在 iomuxc 中添加如下内容: 1 pinctrl_uart3: uart3grp { 2 fsl,pins = < 3 MX6UL_PAD_UART3_TX_DATA__UART3_DCE_TX 0X1b0b14 MX6UL_PAD_UART3_RX_DATA__UART3_

2021-08-07 21:12:19 982

原创 Linux RS232/485/GPS 驱动实验(2)-UART 驱动分析

1、UART 的 platform 驱动框架 打开 imx6ull.dtsi 文件,找到 UART3 对应的子节点,子节点内容如下所示:1 uart3: serial@021ec000 { 2 compatible = "fsl,imx6ul-uart", 3 "fsl,imx6q-uart", "fsl,imx21-uart"; 4 reg = <0x021ec000 0x4000>;5 interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_

2021-08-07 20:46:45 482

原创 Linux RS232/485/GPS 驱动实验(1)

Linux 下 UART 驱动框架 1、uart_driver 注册与注销 uart_driver需要驱动编写人员实现,并使用uart_register_driver注册到内核,卸载驱动的时候,使用uart_unregister_driver卸载。同 I2C、SPI 一样,Linux 也提供了串口驱动框架,我们只需要按照相应的串口框架编写驱动程序即可。串口驱动没有什么主机端和设备端之分,就只有一个串口驱动,而且这个驱动也已经由NXP 官方已经编写好了,我们真正要做的就是在设备树中添加所要使

2021-08-07 19:58:38 384

原创 Linux I2C 驱动实验(3)-运行测试

1、编译驱动程序 编写 Makefile 文件,本章实验的 Makefile 文件和第四十章实验基本一样,只是将 obj-m 变 量的值改为“ap3216c.o”,Makefile 内容如下所示:KERNELDIR := /home/ysy/linux/IMX6ULL/linux/linux-imx-rel_imx_4.1.15_2.1.0_gaCURRENT_PATH := $(shell pwd)obj-m := ap3216c.obuild : kernel_modules

2021-07-29 14:35:41 251

原创 Linux I2C 驱动实验(2)

1 I2C 设备和驱动匹配过程I2C 设备和驱动的匹配过程是由 I2C 核心来完成的,drivers/i2c/i2c-core.c 就是 I2C 的核心 部分,I2C 核心提供了一些与具体硬件无关的 API 函数,比如前面讲过的: 1、i2c_adapter 注册/注销函数 int i2c_add_adapter(struct i2c_adapter *adapter) int i2c_add_numbered_adapter(struct i2c_adapter *adap) ..

2021-07-29 14:26:18 838 1

原创 Linux I2C 驱动实验

input: 20cc000.snvs:snvs-powerkey as /devices/platform/soc/2000000.aips-bus/20cc000.snvs/20cc000.snvs:snvs-powerkey/input/input0input: 20cc000.snvs:snvs-powerkey as /devices/platform/soc/2000000.aips-bus/20cc000.snvs/20cc000.snvs:snvs-powerkey/input/i

2021-07-26 21:22:32 331

原创 RGBLCD显示原理简介

1、像素点于一个“小灯“,不管是液晶屏,还是手机,平板,RGBLCD屏幕他都是有由一个个的彩色小灯构成的。彩色点阵屏每个像素点有三个小灯,红色、绿色和蓝色,也叫做RGB。RGB就是光的三原色。通过调整RGB三种颜色的比例,就可以实现姹紫千红的世界。2、分辨率要想显示文字,图片,视频等等就需要很多个像素点,分辨率说的就是像素点的个数,1080P、720P、2K、4K,8K。1080P=1920*1080,表示一行有1920个像素点,一列有1080个。显示器有尺寸!24村,27村、55寸。尺..

2021-07-25 13:03:06 8896 4

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除