自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 FreeRTOS学习笔记(二)

获取任务运行时间函数代码/* 任务二,实现任务运行时间统计API函数的使用 */while(1)任务查询函数使用例程/* 任务二,实现任务状态查询API函数使用 */printf("task2任务优先级为%ld\r\n",priority_num);printf("任务数量:%ld\r\n",task_num);printf("任务名\t\t任务优先级\t任务编号\r\n");for(i = 0;i++)

2023-11-09 19:44:21 296

原创 FreeRTOS学习笔记(一)

vtaskdelay函数会开启中断,所以在临界区不能用vtaskdelay2.1、任务的动态创建与删除如果在中断中用恢复函数需要在函数后带FromISR后缀,vTaskResumeFromISR()系统所管理的优先级范围:5~15,也就是说优先级在0-4以内的中断freertos不能控制它们。5.1、临界代码段什么是临界段:临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段,如:iic、spi的初始化等。5.2、任务调度器的挂起与恢复1、与临界区不一样的是,挂起任务调度器,未关闭中

2023-10-09 21:44:50 399

原创 嵌入式Linux驱动开发(I2C专题)(七)

读I2C数据时,要先发出设备地址,这是写操作,然后再发起读操作,涉及写、读操作。vmware使用桥接,或者不使用vmware而是直接使用服务器:假设Ubuntu IP为192.168.1.137。这函数完全有驱动程序来驱动:启动传输后,就等待;在中断服务程序里传输下一个数据,知道传输完毕。在Ubuntu的IMX6ULL内核目录下执行如下命令,,上机实验时需要配置内核、编译I2C-GPIO驱动。在IMX6ULL内核源码目录下执行。开发板上挂载NFS文件系统。STM32MP157:函数。IMX6ULL:函数。

2023-09-18 16:16:10 481

原创 嵌入式Linux驱动开发(I2C专题)(六)

I2C在硬件上的接法如下所示,主控芯片引出两条线SCL,SDA线,在一条I2C总线上可以接很多I2C设备,我们还会放一个上拉电阻(放一个上拉电阻的原因以后我们再说)。主芯片通过一根SDA线既可以把数据发给从设备,也可以从SDA上读取数据,连接SDA线的引脚里面必然有两个引脚(发送引脚/接受引脚)。当SCL为低电平时候,大家都不应该使用IIC总线,只有当SCL从低电平变为高电平的时候,IIC总线才能被使用。当它就绪后,就可以不再驱动三极管,这是上拉电阻把SCL变为高电平,其他设备就可以继续使用I2C总线了。

2023-09-14 20:34:20 426

原创 嵌入式Linux驱动开发(I2C专题)(五)

方法3(不推荐):由i2c_driver.detect函数来判断是否有对应的I2C设备并生成i2c_client。i2c_driver跟i2c_client匹配成功后,就调用i2c_driver.probe函数。有时候无法知道该设备挂载哪个I2C bus下,无法知道它对应的I2C bus number。注册:i2c_add_adapter/i2c_add_numbered_adapter。调试时、或者不方便通过代码明确地生成i2c_client时,可以通过用户空间来生成。

2023-09-14 19:50:21 647

原创 嵌入式Linux驱动开发(I2C专题)(四)

参考资料:从芯片手册上可以知道,AT24C02的设备地址跟它的A2、A1、A0引脚有关:打开I2C模块的原理图(这2个文件是一样的):可以读1个字节,也可以连续读出多个字节。连续读多个字节时,芯片内部的地址会自动累加。当地址到达存储空间最后一个地址时,会从0开始。4. 编译4.1 在Ubuntu设置交叉编译工具链STM32MP157IMX6ULL4.2 使用I2C-Tools的源码为IMX6ULL编译时,有如下错误:这是因为IMX6ULL的工具链自带的include目录中

2023-09-14 16:36:02 348

原创 嵌入式Linux驱动开发(I2C专题)(三)

参考资料:APP访问硬件肯定是需要驱动程序的,对于I2C设备,内核提供了驱动程序,通过它可以直接使用下面的I2C控制器驱动程序来访问I2C设备。框架如下:i2c-tools是一套好用的工具,也是一套示例代码。使用一句话概括I2C传输:APP通过I2C Controller与I2C Device传输数据。所以使用I2C-Tools时也需要指定:IMX6ULL修改I2C-Tools的Makefile指定交叉编译工具链在Makefile中,“?=”在第一次设置变量时才会起效果,如果之前

2023-09-13 21:27:50 349

原创 嵌入式Linux驱动开发(I2C专题)(二)

举例:设备地址为0x50的EEPROM,要读取它里面存储地址为0x10的一个字节,应该构造几个i2c_msg?i2c_msg中的flags用来表示传输方向:bit 0等于I2C_M_RD表示读,bit 0等于0表示写。使用一句话概括I2C传输:APP通过I2C Controller与I2C Device传输数据。使用i2c_adapter表示一个I2C BUS,或称为I2C Controller。在上面的i2c_algorithm结构体中可以看到要传输的数据被称为:i2c_msg。

2023-09-13 20:22:16 234

原创 嵌入式Linux驱动开发(I2C专题)(一)

I2C协议中数据传输的单位是字节,也就是8位。I2C-tools中的函数:i2c_smbus_write_i2c_block_data()。I2C-tools中的函数:i2c_smbus_read_i2c_block_data()。I2C-tools中的函数:i2c_smbus_write_block_data()。I2C-tools中的函数:i2c_smbus_write_byte_data()。I2C-tools中的函数:i2c_smbus_write_word_data()。

2023-09-13 19:52:30 716

原创 嵌入式Linux驱动开发(同步与互斥专题)(二)

对于ARMv6及以上的架构,使用include/asm-generic/mutex-dec.h中的__mutex_fastpath_lock函数。对于ARMv6及以上的架构,使用include/asm-generic/mutex-dec.h中的__mutex_fastpath_lock函数。如果mutex的值加1后还是小于等于0,就表示有人在等待mutex,需要去wait_list把它取出唤醒,这需要用到slowpath的函数:__mutex_unlock_slowpath。

2023-09-08 20:28:04 329

原创 嵌入式Linux驱动开发(同步与互斥专题)(一)

在ARMv6以下的架构里,不支持SMP系统,关中断。在ARMv6及以上的架构中,不需要关中断,有ldrex、strex等指令。Linux内核提供了很多类型的锁,它们可以分为两类:① 自旋锁(spinning lock);② 睡眠锁(sleeping lock)。

2023-09-08 14:41:13 445

原创 嵌入式Linux驱动开发(LCD屏幕专题)(四)

即使APP速度很高,LCD控制器不断从Framebuffer中读取数据来显示,而APP不断把数据写入Framebuffer。上述两个缺点的根源是一致的:Framebuffer中的数据还没准备好整帧数据,就被LCD控制器使用了。APP:等待切换完成(在驱动程序中已经等待切换完成了,所以这个调用并无必要)APP:读取buffer信息。APP:开始切换buffer。驱动:分配多个buffer。驱动:保存buffer信息。APP:使能多buffer。APP:写buffer。驱动:切换buffer。

2023-09-07 15:33:07 580

原创 嵌入式Linux驱动开发(LCD屏幕专题)(三)

vmware使用桥接,或者不使用vmware而是直接使用服务器:假设Ubuntu IP为192.168.1.137。vmware使用NAT(假设windowsIP为192.168.1.100)上机测试:使用编译出来的内核、设备树启动板子。现象:LCD上没有企鹅LOGO,在终端中执行。加入我们编写的驱动程序、设备树文件。去除内核自带的驱动程序。重新编译内核、设备树。

2023-09-07 14:43:35 663

原创 嵌入式Linux驱动开发(LCD屏幕专题)(二)

文件:drivers\video\of_display_timing.c。文件:drivers\video\of_display_timing.c。文件:drivers\video\fbdev\core\modedb.c。文件:drivers\video\fbdev\core\fbmon.c。文件:drivers\video\fbdev\mxsfb.c。文件:drivers\video\videomode.c。文件:drivers\video\videomode.c。代码:clock-frequency。

2023-09-07 10:05:17 510

原创 嵌入式Linux驱动开发(LCD屏幕专题)(一)

总的分辨率是 yres*xres。

2023-09-06 17:59:43 849

原创 手写嵌入式操作系统(基于stm8单片机)

【代码】嵌入式操作系统基础(基于stm8单片机)

2023-09-01 12:51:13 1321

原创 Linux(驱动编程)(调试技术)(imx6ull)

查看次函数在那个.c里用过,然后在vscode界面下按alt+p搜索这个.c就可以参考这个.c的头文件。7、驱动程序执行printk函数时会关闭一段时间中断,调有些程序时尽量不要加printk。8、驱动函数xxx_init()的返回值(return)一定要有数值不然加载驱动会有问题。(1)配置pcie驱动(详情见手册EMC拨号指南_linux)4、 输入指令可查看各个中断发生的次数及申请情况。命令看看是否检测到网卡,如没检测到重新启动开发板。6、输入下面命令可打开内核调试信息。2、编译完驱动跟应用后先。

2023-07-12 10:33:46 507

原创 蓝桥杯国赛备赛(嵌入式组)

(4)测试HAL_ADC_Start的ADC启动函数和HAL_ADC_GetValue的ADC读取函数。(4)根据595芯片工作原理,编写seg_display函数(先发送高位)PA3 :RCLK 串型存储时钟输入 (上升沿有效)PA2 :SCK 串行移位时钟输入(上升沿有效)(2)配置PA4为ADC采集模式,并设置单端模式。(2)配置PA1、PA2、PA3为推挽输出。(4)测试ADC采集和GPIO读取功能。(3)配置PA3为gpio输入模式。(1)拓展板跳线帽连接(如下图)1.1、共阴数码管码表。

2023-06-01 22:36:51 2047 17

原创 Linux驱动快速入门(vscode的使用)

3、在Linux内核源码首目录下有compile_commands.json文件,且这个文件内容“cc”改为了“xxxx-gcc”,后先清理之前编译的,后用bear make编译。1、安装了clangd插件。

2023-05-19 10:59:11 327

原创 Linux驱动快速入门(环境搭建)

配置成net模式只要Windows能上网ubantu一定能上网(如下图)给电脑新接一个USB网卡连接到虚拟机。

2023-05-19 09:43:19 136

原创 Linux驱动编程(驱动程序基石)(下)

这里要引入虚拟地址的概念:CPU 发出的地址是虚拟地址,它经过 MMU(Memory Manage Unit,内存管理单元)映射到物理地址上,对于不同进程的同一个虚拟地址,MMU 会把它们映射到不同的物理地址。分别执行 test 程序 2 次,最后执行 ps,可以看到这 2 个程序同时存在,这 2 个程序里 a 变量的地址相同,但是值不同。② 2 个程序同时运行,它们的变量 a 的值是不一样的,一个是 12,另一个是 123。你想映射某个内核 buffer,你需要得到它的物理地址,这得由你提供。

2023-05-13 21:10:39 1358

原创 Linux驱动编程(驱动程序基石)(上)

参考内核头文件:include\linux\workqueue.h。

2023-05-13 16:19:48 813

原创 Linux驱动编程(总线设备驱动模型)

⚫ platform_device.name 和 platform_driver.driver.name。

2023-05-06 16:12:33 1083

原创 Linux驱动编程(分层分离编程思想)

程序仍分为上下结构:上层 leddrv.c 向内核注册 file_operations 结构体;下层 chip_demo_gpio.c 提供 led_operations 结构体来操作硬件。下层的代码分为 2 个:chip_demo_gpio.c 实现通用的 GPIO 操作,board_A_led.c 指定使用哪个 GPIO,即“资源”。使用时,我们只需要在 board_A_led.c 中指定使用哪一个引脚即可。下层实现硬件相关的操作,比如 board_A.c 实现单板 A 的 LED 操作。

2023-05-05 15:49:40 1108

原创 Linux应用编程(线程同步)(互斥锁)

对于一个单线程进程来说,它不需要处理线程同步的问题,所以线程同步是在多线程环境下可能需要注意的一个问题。线程的主要优势在于,资源的共享性,譬如通过全局变量来实现信息共享,不过这种便捷的共享是有代价的,那就是多个线程并发访问共享数据所导致的数据不一致的问题。

2023-04-27 20:51:20 1281

原创 嵌入式QT(Qt Creator 的使用技巧)

在“环境”项下找到键盘,如图,⑤处,切换书签的快捷键,“Ctrl + M”显示红色,说明是与系统的快捷键冲突了。如下图步骤,比如我们要查看QPushButton类,先点击①处的帮助再点击②处的下拉选为索引,在③处输入“QPushButton”,也可以只需要输入“QPush”匹配索引值即可。如何使用搜索出来的帮助文档呢?上面的快捷键可能会与 Ubuntu 或者 Windows 系统的快捷键冲突,或者是有些功能没有定义快捷键,我们也可以在 Qt Creator 里自定义快捷键或者修改原有的快捷键,步骤如下。

2023-04-23 08:45:57 201

原创 嵌入式QT (Qt 信号与槽)

槽就是一个函数,与一般的 C++函数是一样的,可以定义在类的任何部分(public、private 或 protected),可以具有任何参数,也可以被直接调用。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。receiver 是接收信号的对象名称,slot() 是槽函数的名称,需要带括号,有参数时还需要指明参数。总结如下图,可以看到发送者与发送的信号是在一起的,接收者与接收的信号/槽是在一起的。要想使用 Qt 的信号与槽,那么我们必须知道有哪些信号与槽。

2023-04-22 17:27:00 1786

原创 嵌入式QT (使用 Qt Designer 开发)

如果细心的同学,我们还发现这个 clicked()信号并不是 pushButton 的,而是 QAbstactButton 的。点击信号槽连接的按钮如下,如下图①处,点击进入信号槽连接模式(若想退出信号槽连接模式,则点击①处左边的按钮),进入信号与槽的连接模式后,将鼠标选中我们的“关闭程序”按钮,按住按钮,然后用鼠标向外拖动,如②处。在编辑部件模式下我们是看不见的,只有信号槽模式才能看见这样的图示。所谓信号即是一个对象发出的信号,槽即是当这个对象发出这个信号时,对应连接的槽就发被执行或者触发。

2023-04-22 13:39:55 1244

原创 嵌入式QT(在 Ubuntu 下编写 C++)

执行下面的执指令安装编译 C 语言和 C++的环境。执行下面的指令编译。

2023-04-22 09:00:34 195

原创 Linux应用编程(线程)

什么是线程?线程是参与系统调度的最小单位。它被包含在进程之中,是进程中的实际运行单位。一个线程指的是进程中一个单一顺序的控制流,一个进程中可以创建多个线程,多个线程实现并发运行,每个线程执行不同的任务。线程具有以下一些特点:⚫ 线程不单独存在、而是包含在进程中;⚫ 线程是参与系统调度的基本单位;⚫ 可并发执行。同一进程的多个线程之间可并发执行,在宏观上实现同时运行的效果;⚫ 共享进程资源。

2023-04-21 22:45:13 543

原创 Linux应用编程(进程间的通信)

所谓进程间通信指的是系统中两个进程之间的通信,不同的进程都在各自的地址空间中、相互独立、隔离,所以它们是处在于不同的地址空间中,因此相互通信比较难,Linux 内核提供了多种进程间通信的机制。

2023-04-19 17:46:31 737

原创 Linux应用编程(进程)

在 exit()函数之前添加了打印信息,而从上图中可以知道,打印的 pid 值并不相同,0 表示子进程打印出来的,46953 表示的是父进程打印出来的,所以从这里可以证实,fork()函数调用完成之后,父进程、子进程会各自继续执行 fork()之后的指令,它们共享代码段,但并不共享数据段、堆、栈等,而是子进程拥有父进程数据段、堆、栈等副本,所以对于同一个局部变量,它们打印出来的值是不相同的,因为 fork()调用返回值不同,在父、子进程中赋予了 pid 不同的值。守护进程是一种很有用的进程。

2023-04-19 09:04:29 847

原创 Linux应用编程(信号基础)

也就是说当进程此时正在执行某个信号的处理函数,默认情况下,进程会自动将该信号添加到进程的信号掩码字段中,从而在执行信号处理函数期间阻塞该信号,默认情况下,我们期望进程在处理一个信号时阻塞同种信号,否则引起一些竞态条件;如果进程当前正在执行信号处理函数,在处理信号期间接收到了新的信号,如果该信号是信号掩码中的成员,那么内核会将其阻塞,将该信号添加到进程的等待信号集(等待被处理,处于等待状态的信号)中,为了确定进程中处于等待状态的是哪些信号,可以使用 sigpending()函数获取。带着这个问题来聊一聊。

2023-04-17 10:39:21 707 2

原创 Linux应用编程(系统信息与系统资源)

进程时间指的是进程从创建后(也就是程序运行后)到目前为止这段时间内使用 CPU 资源的时间总数,出于记录的目的,内核把 CPU 时间(进程时间)分为以下两个部分:⚫ 用户 CPU 时间:进程在用户空间(用户态)下运行所花费的 CPU 时间。有时也成为虚拟时间(virtualtime)。⚫ 系统 CPU 时间:进程在内核空间(内核态)下运行所花费的 CPU 时间。这是内核执行系统调用或代表进程执行的其它任务(譬如,服务页错误)所花费的时间。

2023-04-15 15:44:02 781 1

原创 Linux应用编程(文件属性与目录)

开头先给大家介绍 Linux 系统下的 7 种文件类型,包括普通文件、目录、设备文件(字符设备文件、块设备文件)、符号链接文件(软链接文件)、管道文件以及套接字文件。接着围绕 stat 系统调用,详细给大家介绍了 struct stat 结构体中的每一个成员,这使得我们对 Linux 下文件的各个属性都有所了解。接着分别给大家详细介绍了文件属主、文件访问权限、文件时间戳、软链接与硬链接以及目录等相关内容,让大家知道在应用编程中如何去修改文件的这些属性以及它们所需要满足的条件。

2023-04-12 22:18:23 969

原创 Linux应用开发(标准I/O库)

标准 I/O 和文件 I/O 的区别如下:⚫ 虽然标准 I/O 和文件 I/O 都是 C 语言函数,但是标准 I/O 是标准 C 库函数,而文件 I/O 则是 Linux系统调用;⚫ 标准 I/O 是由文件 I/O 封装而来,标准 I/O 内部实际上是调用文件 I/O 来完成实际操作的;⚫ 可移植性:标准 I/O 相比于文件 I/O 具有更好的可移植性,通常对于不同的操作系统,其内核向应用层提供的系统调用往往都是不同,譬如系统调用的定义、功能、参数列表、返回值等往往都是不一样的;

2023-04-11 11:23:34 589

原创 Linux应用编程(文件IO进阶)

以上给大家所描述的这样一种情形就属于竞争状态(也成为竞争冒险),操作共享资源的两个进程(或线程),其操作之后的所得到的结果往往是不可预期的,因为每个进程(或线程)去操作文件的顺序是不可预期的,即这些进程获得 CPU 使用权的先后顺序是不可预期的,完全由操作系统调配,这就是所谓的竞争状态。

2023-04-10 20:00:04 458

原创 Linux应用编程(文件IO基础)

每次给打开的文件分配文件描述符都是从最小的没有被使用的文件描述符(0~1023)开始,当之前打开的文件被关闭之后,那么它对应的文件描述符会被释放,释放之后也就成为了一个没有被使用的文件描述符了。:如果读取成功将返回读取到的字节数,实际读取到的字节数可能会小于 count 参数指定的字节数,也有可能会为 0,譬如进行读操作时,当前文件位置偏移量已经到了文件末尾。:如果成功将返回写入的字节数(0 表示未写入任何字节),如果此数字小于 count 参数,这不是错误,譬如磁盘空间已满,可能会发生这种情况;

2023-04-09 22:27:30 311

原创 蓝桥杯(嵌入式突击)(遇到的问题,及解决方法)

下面这个结构体中type数组与num数组存放字符串时要多留一个元素,用来存放‘\0’,否则1、2字符串会连到一起。4、如下结构体当我用最后一个volt_avg的数据时会干扰volt[100]。2、STM32CUBE生成工程弹出code generation界面点open folder程序会崩。解决:新生成的kile可执行文件,编译,发现缺少lcd.c添加后删除之前的kile可执行文件。1、在官方给的LCD例程里,cubeMX生成代码后替换不了以前的文件。两个通道 对用temp[0] 和 temp[1]。

2023-04-02 11:39:46 276

原创 Regmap API 实验

什么情况下会使用 regmap:①、硬件寄存器操作,比如选用通过 I2C/SPI 接口来读写设备的内部寄存器,或者需要读写 SOC 内部的硬件寄存器。②、提高代码复用性和驱动一致性,简化驱动开发过程。③、减少底层 I/O 操作次数,提高访问效率。

2023-03-30 21:19:15 970

STM32F103C8+GA6-B+18b20+OLED(IIC).rar

亲测可用

2023-05-21

实验9 根文件系统移植.pdf

实验9 根文件系统移植.pdf

2022-11-05

实验8 网卡驱动移植.pdf

实验8 网卡驱动移植.pdf

2022-11-05

实验7 Linux内核移植.pdf

实验7 Linux内核移植.pdf

2022-11-04

实验6 u-boot-2013.01移植.doc

实验6 u-boot-2013.01移植.doc

2022-11-03

实验5 Linux内核的安装与加载.pdf

实验5 Linux内核的安装与加载.pdf

2022-11-02

实验4 SD卡启动盘制作.pdf

实验4 SD卡启动盘制作.pdf

2022-11-02

实验3 nfs服务器环境搭建.pdf

实验3 nfs服务器环境搭建.pdf

2022-11-02

实验2 tftp服务器环境搭建.pdf

实验2 tftp服务器环境搭建.pdf

2022-11-02

实验1 ubuntu网络环境配置.pdf

实验1 ubuntu网络环境配置.pdf

2022-11-02

u-boot-fs4412.bin 启动文件

启动文件

2022-10-30

FS4412-DevBoard-V5.pdf

FS4412-DevBoard-扩展板原理图

2022-10-25

FS4412程序下载说明.pdf

FS4412程序下载说明.pdf

2022-10-25

ARM9 交叉编译工具链的安装

ARM9 交叉编译工具链的安装

2022-10-24

SecureCRT安装说明,linux终端

SecureCRT安装说明,linux终端

2022-10-24

空空如也

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

TA关注的人

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