自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 winform项目的三层框架

winform项目三层框架

2023-04-06 17:42:05 749

原创 c语言实现小波多级分解与重构(跟matlab效果一致)

c语言实现小波多级分解与重构

2023-01-04 15:21:31 1584 5

原创 c语言实现多项式曲线拟合(最小二乘法),与matlab效果一致

最近在弄数字信号处理的内容,需要用到曲线拟合来进行滤波降噪,以下通过c语言来实现算法的内容。

2023-01-03 17:48:39 4051 4

原创 STM32输出的数据加载到Matlab中显示(快速傅立叶变换)

最近在学习数字信号处理的内容,想把在stm32上通过傅立叶快速变换得到的幅频响应数据与在Matlab上直接计算的做比较,所以需要把在stm32上存储着计算结果的那个数组的数据导出来,再加载到Matlab上,下面是具体的操作。

2022-09-28 17:33:59 1345 1

原创 移植Qt到ARM平台及搭建Qt交叉编译环境

前言写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。要想在ARM平台上运行Qt程序,得满足以下两个点:1、ARM平台上搭建Qt运行环境2、获得通过交叉编译后的Qt可执行文件一、编译tslib库从网上下载 tslib 源码压缩包,发送到 Ubuntu 中并解压,进入tslib源码目录,内容如下所示:执行命令安装以下软件:sudo apt-get updatesudo apt-get install autoconf automake libtool执

2021-07-22 17:33:43 15574 5

原创 使用 VSCode+gdbserver 进行图形化调试

前言写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。在上一篇博文中已经准备好 gdb 和 gdbserver 这两个工具了,这次就不再讲了。一、VSCode设置在VScode打开上一篇博文中用来测试的源码文件 gdbtest.c,点击“调试”->“打开配置”,然后选择“C++(GDB/LLDB)”选项,如下图所示:选择上图中的“C++(GDB/LLDB)”,会在当前文件夹新建一个名为“launch.json”的文件,此文件会存放在.vscode 目录下,如

2021-07-13 11:25:30 1189

原创 嵌入式gdb调试搭建

前言写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。一、获取gdb 和 gdbserver一般情况下,交叉编译器都自带了gdb 和 gdbserver,因此可以不用移植,直接使用交叉编译器自带的即可。进入到交叉编译器/bin 目录,如下所示:arm-linux-gnueabi-gdb 就是我们需要用到的工具,arm-linux-gnueabi是前缀,不同的交叉编译器,前缀会不一样。gdbserver 也是在交叉编译器的文件中,在 /arm-linux-gnuea

2021-07-12 16:48:58 602 1

原创 Buildroot根文件系统构建

前言写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。简介用 busybox 构建文件系统,仅仅只是帮我们构建好了一些常用的命令和文件,像 lib 库、/etc 目录下的一些文件都需要我们自己手动创建,而且 busybox 构建的根文件系统默认没有用户名和密码设置,还要自己去移植一些第三方软件和库,比如 alsa、iperf、mplayer 等等。那么在实际的应用中,就需要用到 buildroot 这一种工具了,buildroot 不仅集成了 busybox,而且还集成

2021-07-10 15:49:40 472

原创 Linux网络设备驱动-内核stmmac网卡驱动

前言写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。一、硬件组成框架上图 内部MAC + 外部PHY + RJ45 的组合就组成了一个完整的嵌入式网络接口硬件。MAC跟PHY的通讯通过MDIO总线 和 MII/RMII/GMII/RGMII等接口完成,其中驱动程序可以通过 MDIO 总线访问 PHY 芯片的任意一个寄存器,来完成对PHY的配置,而网络数据传输则通过 MII/RMII/GMII/RGMII等接口完成。.一、阅读源代码的过程stmmac驱动源码主

2021-07-04 14:51:21 3197

原创 Linux块设备驱动-ramdisk模拟磁盘

前言写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。一、块设备驱动框架.1、 block_device 结构体linux 内核使用 block_device 表示块设备, block_device 为 一 个 结 构 体 , 定 义 在 include/linux/fs.h 文件中,结构体内容如下:struct block_device { dev_t bd_dev; /* not a kdev_t - it's a search key */ int

2021-06-19 19:53:05 1020

原创 Linux驱动-内核uart串口驱动分析

前言写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。一、简介串口是很常用的一个外设,在 Linux 下通常通过串口和其他设备或传感器进行通信,根据电平的不同,串口分为 TTL , RS232和RS485。不管是什么样的接口电平,其驱动程序都是一样的,通过外接 RS485 这样的芯片就可以将串口转换为 RS485 信号。同 I2C、SPI 一样,Linux 也提供了串口驱动框架,我们只需要按照相应的串口框架编写驱动程序即可。串口驱动没有什么主机端和设备端之分,就只有一

2021-06-11 22:18:11 3279

原创 Linux驱动-spi设备驱动

前言写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。一、简介SPI 驱动框架和 I2C 很类似,都分为主机控制器驱动和设备驱动:1、SPI 主机驱动,SPI 主机驱动就是 SOC 的 SPI 控制器驱动,也叫做 SPI 适配器驱动。2、SPI 设备驱动,SPI 设备驱动就是针对具体的 SPI 设备而编写的驱动。二、SPI主机驱动1、spi_master 结构体SPI 主机驱动就是 SOC 的 SPI 控制器驱动,类似 I2C 驱动里面的适配器驱动。Linux

2021-06-10 14:51:37 809 1

原创 Linux驱动-i2c读写EEPROM

前言写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。一、简介对于 I2C驱动,分为两个部分:i2c总线驱动和i2c设备驱动,总线驱动一旦编写完成就不需要再做修改,其他的 I2C 设备直接调用主机驱动提供的 API 函数完成读写操作即可。这个正好符合 Linux 的驱动分离与分层的思想。下面简单介绍这两部分驱动的区别:1、I2C 总线驱动,I2C 总线驱动就是 SOC 的 I2C 控制器驱动,也叫做 I2C 适配器驱动。2、I2C 设备驱动,I2C 设备驱动就是针对

2021-06-07 16:35:09 2079

原创 Linux驱动-通过input输入子系统实现按键驱动

前言写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。一、实现流程事件处理层不用我们管了,- -是暂时能力有限管不了。写写设备层的程序就好了。软件设计流程:分配一个Input_dev结构体初始化 Input_dev 结构体:设置 支持哪一类事件,该类事件里的那些事件注册输入设备申请按键中断实现中断处理函数(事件上报)二、驱动程序#include <linux/types.h>#include <linux/kernel.h>

2021-06-02 21:57:20 524

原创 Linux驱动-分析input输入子系统工作流程

前言写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。一、简介input 就是输入的意思,因此 input 子系统就是管理输入的子系统,和 pinctrl 和 gpio 子系统一样,都是 Linux 内核针对某一类设备而创建的框架。比如按键输入、键盘、鼠标、触摸屏等等这些都属于输入设备,不同的输入设备所代表的含义不同,按键和键盘就是代表按键信息,鼠标和触摸屏代表坐标信息,因此在应用层的处理就不同,对于驱动编写者而言不需要去关心应用层的事情,我们只需要按照要求上报这些输入

2021-06-02 21:34:05 812 1

原创 Linux驱动-platform总线设备驱动

前言写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。一、简介platform总线是一种虚拟的总线,相应的设备则为platform_device,而驱动则为platform_driver。platform总线将设备和驱动绑定,在系统每注册一个设备的时候,会寻找与之匹配的驱动;相反的,在系统每注册一个驱动的时候,会寻找与之匹配的设备,而匹配由总线完成。二、platform 总线Linux系统内核使用bus_type结构体表示总线,此结构体定义在文件include/li

2021-05-30 16:35:44 203

转载 阻塞和非阻塞IO,异步和同步IO

本文讨论的背景是Linux环境下的network IO。本文最重要的参考文献是Richard Stevens的“UNIX? Network Programming Volume 1, Third Edition: The Sockets Networking ”,6.2节“I/O Models ”,Stevens在这节中详细说明了各种IO的特点和区别,如果英文够好的话,推荐直接阅读。Stevens的文风是有名的深入浅出,所以不用担心看不懂。本文中的流程图也是截取自参考文献。Stevens在文章中一共比较了

2021-05-28 09:13:42 1414

原创 字符设备驱动——按键中断+定时器消抖

前言写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。一、中断号每个中断都有一个中断号,通过中断号即可区分不同的中断。在内核源码的根目录打开/arch/arm/mach-s5p6818/include/mach/s5p6818_irq.h,里面有如下内容:可以看出一共有5*32=160个中断号提供给GPIO使用,每一个GPIO口对应一个中断号,有如下规则:GPIOA15对应的中断号为:IRQ_GPIO_A_START+15。也可以通过函数gpio_to_irq获取

2021-05-25 22:11:37 422

原创 字符设备驱动-内核定时器

前言写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。内核时间管理简介一、宏定义HZLinux 内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序、对于我们驱动编写者来说最常用的定时器。硬件定时器提供时钟源,时钟源的频率可以设置, 设置好以后就周期性的产生定时中断,系统使用定时中断来计时。中断周期性产生的频率就是系统频率,也叫做节拍率(tick rate)(有的资料也叫系统频率),比如 1000Hz,100Hz 等等说的就是系统节拍率。系统节拍率是可以设置

2021-05-24 17:51:24 170

原创 Linux并发与竞争-原子操作,自旋锁,信号量,互斥体

前言写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。一、线程的并发与竞争Linux 系统是个多任务操作系统,会存在多个任务同时访问同一片内存区域,这些任务可能会相互覆盖这段内存中的数据,造成内存数据混乱。针对这个问题必须要做处理,严重的话可能会导致系统崩溃。现在的 Linux 系统并发产生的原因很复杂,总结一下有下面几个主要原因:①、多线程并发访问,Linux 是多任务(线程)的系统,所以多线程访问是最基本的原因。②、抢占式并发访问,从 2.6 版本内核开始,Li

2021-05-20 17:44:21 170

原创 字符设备驱动-通过GPIO子系统提供的API实现LED驱动

前言写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。一、GPIO子系统提供的APIgpio 子系统提供了 API 函数来操作指定的 GPIO,gpio 子系统向驱动开发人员屏蔽了具体的读写寄存器过程。这就是驱动分层与分离的好处,大家各司其职,做好自己的本职工作即可。gpio 子系统提供的常用的 API 函数有下面几个:1、gpio_request 函数gpio_request 函数用于申请一个 GPIO 管脚,在使用一个 GPIO 之前一定要使用 gpio_req

2021-05-19 12:03:22 466

原创 字符设备驱动-LED驱动

前言写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。一、驱动程序#include <linux/types.h>#include <linux/kernel.h>#include <linux/delay.h>#include <linux/ide.h>#include <linux/init.h>#include <linux/module.h>#include <linux/

2021-05-13 16:52:40 197 1

原创 使用VSCode编写工程时添加头文件路径的方法

方法在工程的根目录下创建 .vscode 文件夹,按下“Crtl+Shift+P”打开 VSCode 的控制台,然后输入“C/C++: Edit configurations(JSON) ”,打开 C/C++编辑配置文件,会在 .vscode 目录下生成一个名为 c_cpp_properties.json 的文件,内容中的"includePath":表示头文件路径,往这个变量添加路径就可以了。例:{ "configurations": [ { "name"

2021-05-11 20:24:39 11959 1

原创 构建Linux根文件系统

前言写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。一、修改Makefile,添加编译器进入解压后的BusyBox目录,打开顶层Makefile,添加 ARCH 和 CROSS_COMPILE的值,如下所示:CROSS_COMPILE ?=arm-linux-gnueabi-...ARCH ?= arm二、配置BusyBox跟我们编译 Uboot、Linux kernel 一样,我们要先对 BusyBox 进行默认的配置,使用如下命令来配置一下 BusyB

2021-05-11 14:39:15 302 1

原创 Linux根文件系统分析-init进程和busybox

前言写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。运行流程框架BusyBox下载一讲到根文件系统,第一个就是想到BusyBox这个东东,它集成了BusyBox 是一个大的工具箱,这个工具箱里面集成了 Linux 的许多工具和命令,如 ls、mv、ifconfig 等命令 BusyBox 都会提供。等下分析的 init 进程函数也是在BusyBox的源码中的,所以要想知道init进程的运行流程,就必须把BusyBox源码下载下来。BusyBox可直接在官网下载:h

2021-05-09 16:46:39 328

原创 内核启动流程

前言写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。启动流程分析一、寻找入口函数在分析uboot启动流程时,是通过链接脚本找到入口函数的,内核也一样,在 arch/arm/kernel中找到 vmlinux.lds 链接脚本,vmlinux.lds有以下代码:OUTPUT_ARCH(arm)ENTRY(stext)jiffies = jiffies_64;SECTIONS可以知道Linux内核入口,入口为stext,stext定义在arch/arm/ke

2021-05-02 15:34:29 823

原创 内核编译-分析编译流程

前言写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。编译流程其实内核的编译跟uboot编译差不多,uboot的编写方式就是参考内核源码来的,等下分析的顶层Makefile就能看出来了,下面是内核编译的流程:1、make distclean ------第一次编译时需清理一下工程文件2、make xxx_defconfig------xxx一般是半导体厂家根据soc的架构或者名称命名的,xxx_defconfig是半导体厂家提供的内核默认配置文件,在arch\ar

2021-04-29 15:28:50 677

原创 u-boot 自定义命令

前言写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。一、命令的定义先看一下uboot中命令是如何定义的,打开common文件夹会发现里面有很多以cmd_xxx.c来命名的c文件, 随便打开一个c文件,里面都会有一个do_xxx的函数 和 U_BOOT_CMD宏定义, 其实uboot使用宏U_BOOT_CMD来定义命令,宏 U_BOOT_CMD 定义在文件include\command.h中,定义如下:#define U_BOOT_CMD(_name, _max

2021-04-21 22:37:31 423

原创 u-boot 启动流程分析

前言写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。一、在链接脚本中找程序入口在arch\arm\cpu\slsiap中找到u-boot.lds,里面可以看到ENTRY(_stext),即程序入口就是_stext了。OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")OUTPUT_ARCH(arm)ENTRY(_stext)SECTIONS{ . = 0x0000000

2021-04-21 17:54:08 282

原创 u-boot 编译过程分析

11111

2021-04-16 16:28:10 2059

原创 s5p6818裸机-spi

前言写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。SPI简介SPI 全称是 Serial Perripheral Interface,也就是串行外围设备接口。SPI 是 Motorola 公司推出的一种同步串行接口技术,是一种高速、全双工的同步通信总线,SPI 时钟频率相比 I2C 要高很多,最高可以工作在上百 MHz。SPI 以主从方式工作,通常是有一个主设备和一个或多个从设备,一般 SPI 需要4 根线,但是也可以使用三根线(单向传输),这四根线如下:①、CS

2021-04-08 15:43:03 351 1

原创 s5p6818裸机-i2c

前言写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。实现流程实现i2c传输功能的步骤:1、初始化i2c,包括通过I2CCLKENB启动i2c的时钟源PCLK,通过I2CCON设置时钟分频得到i2c_clk,通过I2CSTAT开启i2c功能。2、建立i2c传输的数据结构3、编写产生读/写开始信号的函数,产生读/写停止信号的函数,检查ack应答信号的函数4、编写主机模式下的读/写函数具体实现1、初始化i2c其中i2c_clk的时钟源——PCLK的开启需要到手

2021-04-04 16:46:59 278

原创 s5p6818裸机-uart串口

前言写文章的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。实现流程1、复用IO引脚:通过板子原理图找到对应的UART引脚,然后通过GPIOXALTFN0或者GPIOXALTFN1把引脚复用为UART功能,引脚的电气特性暂时用不上,设置默认。2、设置uart时钟:通过UARTCLKGEN0L寄存器选择任意一个PLLx作为时钟源,然后设置分频得到最终的Uart_Clk串口时钟,最后通过UARTCLKENB使能串口时钟3、初始化uart:通过ULCON设置数据模式为:8数据位

2021-03-29 10:54:07 1013

原创 s5p6818裸机-irq中断

前言本次学习的目的是通过按按键触发按键中断,调用相关的中断服务函数,实现蜂鸣器鸣响。通过裸机学习能使自己对SoC的运行环境,开发环境有更好的了解。软件实现流程1)在start.S启动汇编中实现中断向量表,及irq处理函数2)实现irq中断结构体数组,irq通用中断服务函数注册函数(中断号和中断服务函数的联系)3)实现gic中断控制器初始化函数4)实现gpio初始化函数,复用-中断配置流程具体1、异常向量表和IRQ_Handler一般都在start.S里面编写,因为需要做一些中断触发时保护现场

2021-03-24 17:59:20 962 1

原创 S5P6818-通过SD卡启动裸机程序

前言由于自己第一次发表文档,对于文档的架构还需多多练习。写文档的目的是想通过记录自己的学习过程,以便以后使用到相关的知识点可以回顾和参考。一、运行裸机程序的方式大概分成两种:1)在uboot模式下,使用go直接跳转到程序链接的地址来跑程序。2)制作SD启动卡,在SRAM中把整个启动过程需要做的事情,例如初始化PLL等做一遍,再去跳转到DRAM(即DDR)中链接的地址那里跑程序区别是:如果对新手来说,使用第一种方式,相对来说比较简单方便,但是不利于了解整个启动过程是怎么个流程的,只能通过观察外设的一

2021-03-19 12:25:59 989 4

空空如也

空空如也

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

TA关注的人

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