自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(56)
  • 资源 (1)
  • 收藏
  • 关注

原创 platform 设备驱动实验

总线(bus)、驱动(driver)和设备(device)模型,比如 I2C、 SPI、 USB 等总线。但是在 SOC 中有些外设是没有总线这个概念的,但是又要使用总线、驱动和设备模型该怎么办呢?为了解决此问题, Linux 提出了 platform 这个虚拟总线,相应的就有 platform_driver 和 platform_device.

2024-06-26 19:56:26 129

原创 异步通知实验学习

算是在软件层次上对中断的一种模拟,驱动可以通过主动向应用程序发送信号的方式来报告自己可以访问了,应用程序获取到信号以后就可以从驱动设备中读取或者写入数据了。整个过程就相当于应用程序收到了驱动发送过来了的一个中断,然后应用程序去响应这个中断,在整个处理过程中应用程序并没有去查询驱动设备是否可以访问,一切都是由驱动设备自己告诉给应用程序的。fasync_helper 函数的前三个参数就是 fasync 函数的那三个参数,第四个参数就是要初始化的 fasync_struct 结构体指针变量。设置信号的处理函数。

2024-06-21 15:53:14 927

原创 Linux 阻塞和非阻塞 IO 实验学习

FD_ZERO 用于将 fd_set 变量的所有位都清零, FD_SET 用于将 fd_set 变量的某个位置 1,也就是向 fd_set 添加一个文件描述符,参数 fd 就是要加入的文件描述符。传统的 selcet 和 poll 函数都会随着所监听的 fd 数量的增加,出现效率低下的问题,而且poll 函数每次必须遍历所有的描述符来检查就绪的描述符,这个过程很浪费时间。等待队列头就是一个等待队列的头部,每个访问设备的进程都是一个队列项,当设备不可用的时候就要将这些进程对应的等待队列项添加到等待队列里面。

2024-06-21 10:05:28 693

原创 Linux 中断实验

假如 A 任务调用 local_irq_disable 关闭全局中断 10S,当关闭了 2S 的时候 B 任务开始运行, B 任务也调用local_irq_disable 关闭全局中断 3S, 3 秒以后 B 任务调用 local_irq_enable 函数将全局中断打开了。在 Linux 内核中要想使用某个中断是需要申请的, request_irq 函数用于申请中断, request_irq函数可能会导致睡眠,因此不能在中断上下文或者其他禁止睡眠的代码段中使用 request_irq 函数。

2024-06-19 20:42:16 907

原创 Linux 内核定时器实验学习

Linux 内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序、对于我们驱动编写者来说最常用的定时器。硬件定时器提供时钟源,时钟源的频率可以设置, 设置好以后就周期性的产生定时中断,系统使用定时中断来计时。中断周期性产生的频率就是系统频率,也叫做节拍率(tick rate)(有的资料也叫系统频率),比如 1000Hz, 100Hz 等等说的就是系统节拍率。CONFIG_HZ 为 100, Linux 内核会使用 CONFIG_HZ 来设置自己的系统时钟。

2024-06-16 20:24:11 821

原创 Linux 按键输入实验

读取按键 IO 的电平,如果为 0 的话就表示按键按下了,如果按键按下的话就等待按键释放。在本章实验中蜂鸣器使用的 PIN 为 UART1_CTS_B,因此先检查 PIN 为 UART1_CTS_B 这个 PIN 有没有被其他的 pinctrl 节点使用,如果有使用的话就要屏蔽掉,然后再检查 GPIO1_IO18这个 GPIO 有没有被其他外设使用,如果有的话也要屏蔽掉。本章我们实现按键输入,在驱动程序中使用一个整形变量来表示按键值,应用程序通过 read 函数来读取按键值,判断按键有没有按下。

2024-06-16 09:57:33 476

原创 Linux 并发与竞争实验学习

每次打开驱动设备的时候先使用 atomic_dec_and_test 函数将 lock 减 1,如果 atomic_dec_and_test函数返回值为真就表示 lock 当前值为 0,说明设备可以使用。其他设备正在使用 LED 灯,那么就只能退出了,在退出之前调用函数 atomic_inc 将 lock 加 1,因为此时 lock 的值被减成了负数,必须要对其加 1,将 lock 的值变为 0。使用了那么变量就加一,设备被释放以后变量就减 1,我们只需要使用自旋锁保护这个变量即。出现如图则证明成功。

2024-06-15 19:57:48 937

原创 Linux 并发与竞争基础知识学习

设备结构体变量就不是整型变量,我们对于结构体中成员变量的操作也要保证原子性,在线程 A 对结构体变量使用期间,应该禁止其他的线程来访问此结构体变量,这些工作原子操作都不能胜任,需要本节要讲的锁机制,在 Linux内核中就是自旋锁。如果使用的是 64 位的 SOC,那么就要使用 64 位的原子操作函数。防止并发访问共享资源,换句话说就是要保护共享资源,防止进行并发访问,因为驱动程序各不相同,那么数据也千变万化,一般像全局变量,设备结构体这些肯定是要保护的,至于其他的数据就要根据实际的驱动程序而定了。

2024-06-14 11:26:48 1027

原创 Linux 蜂鸣器实验

在本章实验中蜂鸣器使用的 PIN 为 SNVS_TAMPER1,因此先检查 PIN 为 SNVS_TAMPER1这个 PIN 有没有被其他的 pinctrl 节点使用,如果有使用的话就要屏蔽掉,然后再检查GPIO5_IO01 这个 GPIO 有没有被其他外设使用,如果有的话也要屏蔽掉。其余步骤仍旧和上一节编写驱动开发类似。

2024-06-11 23:09:49 269

原创 pinctrl 和 gpio 子系统实验学习

gpio1 节点的 compatible 属性描述了兼容性,在 Linux 内核中搜索“fsl,imx6ul-gpio”和“fsl,imx35-gpio”这两个字符串,查找 GPIO 驱动文件。示例代码 45.2.2.3 mxc_gpio_dt_ids 匹配表158 };第 156 行的 compatible 值为“fsl,imx35-gpio”,和 gpio1 的 compatible 属性匹配,因此 gpiomxc.c 就是 I.MX6ULL 的 GPIO 控制器驱动文件。

2024-06-11 11:14:24 906

原创 设备树下的 LED 驱动实验

新建名为“4_dtsled”文件夹,然后在 4_dtsled 文件夹里面创建vscode 工程,工作区命名为“dtsled”。①、在 imx6ull-alientek-emmc.dts 文件中创建相应的设备节点。②、编写驱动程序(在第四十二章实验基础上完成),获取设备树中的相关属性值。③、使用获取到的有关属性值来初始化 LED 所使用的 GPIO。index 参数用于指定要映射的具体内存段。of_iomap函数上一节已经学习了函数,剩余编译测试和之前的是一样的。

2024-06-08 19:32:47 305

原创 Linux 设备树学习

设备树(Device Tree),将这个词分开就是“设备”和“树”,描述设备树的文件叫做 DTS(DeviceTree Source),这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如CPU 数量、 内存基地址、 IIC 接口上接了哪些设备、 SPI 接口上接了哪些设备等等。具体如下图所示:树的主干就是系统总线, IIC 控制器、 GPIO 控制器、 SPI 控制器等都是接到系统主线上的分支。

2024-06-07 18:10:19 671

原创 新字符设备驱动实验学习

register_chrdev 和 unregister_chrdev 这两个函数是老版本驱动使用的函数,现在新的字符设备驱动已经不再使用这两个函数,而是使用Linux内核推荐的新字符设备驱动API函数。新字符设别驱动API函数在驱动模块加载的时候自动创建设备节点文件。

2024-06-05 21:04:29 825

原创 嵌入式 Linux LED 驱动开发实验学习

I.MX6U-ALPHA 开发板上的 LED 连接到 I.MX6ULL 的 GPIO1_IO03 这个引脚上,进行这个驱动开发实验之前,需要了解下地址映射。

2024-06-05 19:57:44 1164

原创 ARM Linux 驱动开发学习之字符设备驱动开发

字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。比如我们最常见的点灯、按键、 IIC、 SPI,LCD 等等都是字符设备,这些设备的驱动就叫做字符设备驱动。Linux 应用程序对驱动程序的调用如下图所示:使用 open 函数来打开文件/dev/led,使用完成以后使用 close 函数关闭/dev/led 这个文件。

2024-06-03 16:32:52 930

原创 U-boot、linux内核、根文件系统移植以及程序

终于这几天把这个移植的流程过了一遍,所以特此回来总结。

2024-06-02 19:46:14 1062

原创 Linux学习C语言版 LED 灯实验

大部分情况下都是使用 C 语言去编写的。只是在开始部分用汇编来初始化一下 C 语言环境,比如初始化 DDR、设置堆栈指针 SP 等等,当这些工作都做完以后就可以进入 C 语言环境,也就是运行 C 语言代码,一般都是进入 main 函数。所以我们有两部分文件要做:①、汇编文件汇编文件只是用来完成 C 语言环境搭建。②、C 语言文件C 语言文件就是完成我们的业务层代码的,其实就是我们实际例程要完成的功能。

2024-05-10 10:36:54 684

原创 嵌入式Linux学习第四天启动方式学习

当 BOOT_MODE1 为 1,BOOT_MODE0 为 0 的时候此模式使能,在此模式下,芯片会执行内部的 boot ROM 代码,这段 boot ROM 代码会进行硬件初始化(一部分外设),然后从 boot 设备(就是存放代码的设备、比如 SD/EMMC、NAND)中将代码拷贝出来复制到指定的 RAM 中,一般是 DDR。内部 Boot ROM 要求 IVT 应该放到指定的位置,不同的启动设备位置不同,而 IVT 在整个 load.imx 的最前面,其整个位置都是相对于存储设备的起始地址的偏移。

2024-05-08 20:54:17 917

原创 嵌入式linux学习第三天汇编语言点灯

反之,时间越多波形就越缓,压摆率就越低。IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00 的寄存器,寄存器地址为 0X020E005C,这个寄存器是 32 位的,但是只用到了最低 5 位,其中bit0~bit3(MUX_MODE)就是设置 GPIO1_IO00 的复用功能的。IMR 寄存器也是一个 GPIO 对应一个位,IMR 寄存器用来控制 GPIO 的中断禁止和使能,如果使能某个 GPIO 的中断,那么设置相应的位为 1 即可,反之,如果要禁止中断,那么就设置相应的位为 0 即可。

2024-05-07 22:19:54 902 1

原创 嵌入式Linux学习第二天

今天学习linuxC编程。首先要熟悉linux下编写c程序的过程。

2024-05-06 20:01:24 855 1

原创 嵌入式linux学习第一天

参考正点原子Linux开发文档。记录下知识点。

2024-05-06 09:43:57 754 1

原创 FreeRTOS 软件定时器

软件定时器允许设置一段时间,当设置的时间到达之后就执行指定的功能函数,被定时器调用的这个功能函数叫做定时器的回调函数。回调函数的两次执行间隔叫做定时器的定时周期,简而言之,当定时器的定时周期到了以后就会执行回调函数。在实时操作系统(RTOS)中,软件定时器的设计通常是为了在特定的时间点执行一段代码,而这段代码是通过定时器的回调函数来实现的。定时器服务任务(或称为定时器守护任务)是一个特殊的任务,负责管理和执行所有软件定时器的回调函数。任务优先级定时器服务任务通常运行在一个相对较低的优先级。

2024-05-04 14:59:01 881

原创 FreeRTOS任务通知

此函数也是用来获取任务通知的,不过此函数比 ulTaskNotifyTake()更为强大,不管任务通知用作二值信号量、计数型信号量、队列和事件标志组中的哪一种,都可以使用此函数来获取任务通知。使用任务通知的话效率会更高,任务通知在 FreeRTOS 中是一个可选的功能,任务通知是一个事件,假如某个任务通知的接收任务因为等待任务通知而阻塞的话,向这个接收任务发送任务通知以后就会解除这个任务的阻塞状态。函数只是将任务通知值简单的加一,此函数是个宏,真正执行的是函数 xTaskGenericNotify(),

2024-05-03 20:13:36 729

原创 FreeRTOS 事件标志组

从上图可以看出时间标志组就是一个整数,分别为无符号16和32位整数,事件标志组的数据类型为 EventGroupHandle_t,当 configUSE_16_BIT_TICKS 为 1 的时候事件标志组可以存储 8 个事件位,当 configUSE_16_BIT_TICKS 为 0 的时候事件标志组存储 24个事件位。此函数用于获取当前事件标志组的值,也就是各个事件位的值。事件位用来表明某个事件是否发生,事件位通常用作事件标志,事件标志组是一组事件标志位的集合, 可以简单的理解事件标志组,就是一个整数。

2024-05-03 10:40:54 850

原创 优先级翻转以及互斥信号量

当阻塞时间1000ms过去后,高优先级抢占,开始获取信号量,但是低优先任务获取信号量后进入delay_ms,占有该信号量,所以此时高优先级任务进入阻塞,此时中优先级任务开始运行,接下来阻塞1000ms,发现1000ms后低优先级还在延时当中,所以中优先级一直运行,直到低优先级释放信号量,此时高优先级任务解除阻塞,继续正常运行。:如果在中断服务例程中,RTOS调度器决定另一个任务比当前运行的任务有更高的运行优先级,那么当中断服务完成,从ISR返回到用户任务执行时,系统会切换到那个更高优先级的任务执行。

2024-05-02 20:47:15 830

原创 Freertos计数和二值信号量学习

有些资料中也将计数型信号量叫做数值信号量,二值信号量相当于长度为 1 的队列,那么计数型信号量就是长度大于 1 的队列。同二值信号量一样,用户不需要关心队列中存储了什么数据,只需要关心队列是否为空即可。计数型信号量通常用于如下两个场合:1、事件计数在这个场合中,每次事件发生的时候就在事件处理函数中释放信号量(增加信号量的计数值),其他任务会获取信号量(信号量计数值减一,信号量值就是队列结构体成员变量uxMessagesWaiting)来处理事件。在这种场合中创建的计数型信号量初始计数值为 0。

2024-05-01 17:02:55 605

原创 FreeRTOS队列

在实际的应用中,常常会遇到一个任务或者中断服务需要和另外一个任务进行“沟通交流”,这个“沟通交流”的过程其实就是消息传递的过程。在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式,但是如果在使用操作系统的应用中用全局变量来传递消息就会涉及到“资源管理”的问题。需要队列的原因如上图所示:当我们同时操作一个变量时候,比如进行a++这个操作,其实内部是分为这三个步骤:读数据、修改数据、写数据。假如同时进行任务1和任务2,a的值是否为2呢。但其实a的值是未知的。

2024-04-20 18:22:33 728

原创 FreeRTOS时间管理

通过检查。

2024-04-16 21:08:01 869

原创 FreeRTOS任务切换学习

所谓任务切换,就是CPU寄存器的切换。假设当由任务A切换到任务B时,主要分为两步:1:需暂停任务A的执行,并将此时任务A的寄存器保存到任务堆栈,这个过程叫做保存现场;2:将任务B的各个寄存器值(被存于任务堆栈中)恢复到CPU寄存器中,这个过程叫做恢复现场;对任务A保存现场,对任务B恢复现场,这个整体的过程称之为:上下文切换。下面要补充几个知识,以便更好理解任务切换。

2024-04-10 22:09:51 748

原创 FreeRTOS启动任务调度器

这部分内容就要去深入了解源码以及熟悉汇编语言的操作。依旧正点原子的视频。

2024-04-09 22:19:39 592

原创 FreeRTOSFreeRTOS列表和列表项

列表就是FreeRTOS中的数据结构,它被用来跟踪FreeRTOS中的任务。就绪列表(Ready Lists):对于每个优先级,FreeRTOS都维护一个就绪列表。当任务处于就绪状态,能够运行,但由于CPU正被其他任务使用而无法立即执行时,该任务会被放入相应优先级的就绪列表中。当CPU可用时,调度器会从最高优先级的就绪列表中选择任务来执行。阻塞列表(Blocked Lists):当任务等待某个事件(如信号量、互斥量或定时器)时,它会被放入阻塞列表。阻塞列表用于跟踪哪些任务正在等待资源变得可用。

2024-04-07 22:04:14 779

原创 FreeRTOS临界段代码保护和任务调度器的挂起与恢复学习

所谓临界段代码保护就是指必须完成运行,不能被打断的代码段。比如需要严格按照时序除初始化的外设:IIC、SPI,再或者因为系统自身需求和用户需求。FreeRTOS 在进入临界段代码的时候需要关闭中断,当处理完临界段代码以后再打开中断。也就是临界区屏蔽了中断,系统调度靠中断,ISR也依靠中断。具体调用如上述函数,临界段代码保护具有以下特点:1:成对使用2:支持嵌套3:要保持临界区代码内容短。

2024-04-04 15:53:47 629

原创 FreeRTOS中断管理以及实验

这里假如我们要设置PendSV的优先级为15,我们首先要计算在想改变的位置的值是多少。所以将15左移4位。STM32中中断分组分为5个优先级分组,而FreeRTOS中了为了方便管理,采用中断分组4,也就是全部4bit用于抢占优先级,而抢占优先级的范围也就是0-15。2:子优先级:当同时发生具有相同抢占优先级的两个中断时候,子优先级小的优先执行,但是抢占优先级相同的时候,子优先级之间不能发生打断。ARM Cortex-M 使用了 8 位宽的寄存器来配置中断的优先等级,这个寄存器就是中断优先级配置寄存器 ,

2024-04-03 21:14:06 784

原创 FreeRTOS 任务挂起和恢复API函数

返回值:pdTRUE:恢复运行的任务的任务优先级等于或者高于正在运行的任务(被中断打断的任务),这意味着在退出中断服务函数以后必须进行一次上下文切换。pdFALSE:恢复运行的任务的任务优先级低于当前正在运行的任务(被中断打断的任务),这意味着在退出中断服务函数的以后不需要进行上下文切换。如果敲门的人是你的好朋友,而且你已经约好了(这意味着“中断”很重要,优先级高或等同于你正在做的事情),你会选择停下手中的事情(做饭),去开门(处理中断)。创建任务的话那么函数的返回值就是此任务的任务句柄。

2024-04-01 21:20:11 742

原创 FreeRTOS任务创建和删除(动态)内部实现过程

往深处去看代码花了好久才理解的差不多,特此记录总结下,具体来分析代码,首先来看这个函数:这个函数也就是动态创建任务的函数,入口参数具体为下图这些值:函数名称: xTaskCreate,返回类型: BaseType_t,通常是一个整数类型,用于表示函数执行的成功与否。在FreeRTOS中,成功创建任务通常返回pdPASS(值为1),失败则返回pdFAIL(值为0)。

2024-03-29 16:22:41 620

原创 FreeRTOS移植STM32F103开发板HAL库版本

下载最新源码。下载下来之后,源码结构如下:其中我们要用到的移植文件为主要是FreeRTOS 这个文件夹里面的内容。Demo 文件夹里面就是 FreeRTOS 的相关例程,License这个文件夹里面就是相关的许可信息,要用 FreeRTOS 做产品的得仔细看看,尤其是要出口的产品。Source文件夹中存放的就是FreeRTOS的源码了。打开如下图所示:归根结底就是个纯软件的东西,它是怎么和硬件联系在一起的呢?

2024-03-27 21:03:47 503

原创 指针深刻理解

看完鹏哥讲的c语言进阶视频后,又找来C语言深度剖析这本书仔细看了一遍,来进一步巩固和理解指针这个重点。

2024-03-03 19:52:09 839 1

原创 C++编译过程

我们写程序通常情况要考虑如何将文本转化为可执行文件,在这里编译器所执行的工作就是完成compliling和linking。而c++编译器所要做的就是把文本变为中继格式,也就是obj文件 ,然后obj文件 会传入linker中,linker就会发挥它的作用。compiling过程中先预处理代码,所有预处理语句会被评估,预处理后,会进入tokenizing(标记解释)和parsing(解析)阶段。 基本上结果就是创建某种叫做abstract syntax tree(抽象语法树),也就是我们代码的表达,编译器的工

2022-07-05 18:16:04 690 1

原创 Clion同时运行多个cpp文件

假期学习c++,过程中我采用的软件是clion2020.1,配置完成c++的环境之后,根据编程练习由于需要建立不同的cpp文件并且有多个main函数,具体实现做法也很简单。如上图,在cmakelists.txt文件如方框中加入以下语句,保存即可。然后运行时候记得更改当前运行的文件是谁即可。当前运行为aaa,也就是main.cpp文件。输出结果为:证明结果正确,切换bbb下运行,可以得到如下图的结果:则证明配置成功。...

2022-06-20 21:02:58 930

原创 ROS学习第六天

1:功能包的创建这一节学习参数的编程和使用。首先创建这一讲所需要的功能包。输入指令:cd /catkin_ws/srccatkin_create_pkg learning_parameter roscpp rospy std_srvs如下图则功能包创建完毕。下面首先了解参数命令行的使用,具体如下图所示:首先第一条指令:rosparam list可以看到下列参数:显示某个参数值: rosparam get /turtlesim/background_b这里显示是小海龟终端背景颜色的RG

2022-02-28 10:49:20 258

傅里叶变换C语言实现以及python验证.zip

傅里叶变换C语言实现版本,可用python的matplotlib来验证正确性。里面的程序注释很充分,学习傅里叶变换是一个很有用的帮手

2020-06-28

空空如也

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

TA关注的人

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