- 博客(137)
- 资源 (22)
- 收藏
- 关注
原创 【BSP开发经验】用户态栈回溯技术
在这张图中,计算机的栈空间采用的是向下增长的方式(MIPS架构没有专门入栈和出栈指令,栈的增长方向不定,可能是高地址向低地址增长,或是相反),SP(stack pointer)就是当前函数的栈指针,它指向的是栈底的位置。在MIPS平台开始栈回溯的时候,我们可以获取的信息有寄存器SP,PC,RA的内容,使用PC和RA我们可以得到当前函数和上一级函数地址,问题在于怎样通过SP寻找到上一级函数的栈,在没有直接获取栈地址的方法的情况下需要通过进行代码分析来实现。参考后面调用func1函数的操作。
2024-05-23 22:21:41 795
原创 【BSP开发经验】简易文件系统实现方式
../进程目录信息//进程打开文件信息/...int users;/结构体实例用户数量/int umask;/进程根目录和当前工作目录//目录项所在文件系统挂载信息,vfsmount.mnt//目录项指针/root成员表示进程访问内核根文件系统,通常为根文件系统的根节点,但也可以通过chroot()系统调用修改进程根目录。进程以绝对路径搜索文件时,从进程根目录开始。pwd成员表示进程当前工作目录。进程以相对路径访问文件时,将会从当前工作目录开始查找。
2024-05-23 22:14:27 838
原创 【BSP开发经验】Linux与uboot控制台串口
leadcore1861平台在到板后发现引出的串口控制台没有任何输出,询问厂家后了解到厂家代码指定串口4作为串口控制台,而我们使用了串口0,所以需要对uboot串口和linux串口控制台进行修改,指定到串口0输出。(3)board/开发板名字/serial.c、cpu/cpu名字/serial.c、drivers/serial/serial.c、drivers/serial/serial_xxx.c。next表示指向下一个串口设备的指针。在include/serial.h 中定义了表示串口设备的数据结构。
2024-03-01 08:53:34 1395 1
原创 【BSP开发经验】Linux内核开发调试手段
内核开发比用户空间开发更难的一个因素就是内核调试艰难。内核错误往往会导致系统宕机,很难保留出错时的现场。调试内核的关键在于你的对内核的深刻理解,同时需要掌握一些内核调试的基本手段。
2024-03-01 08:47:55 1650 1
原创 【网络BSP开发经验】网络流量应用识别技术
针对上述问题,我们新框架需要完成以下几个重要的功能点:1)报文解析流程设备无关化2)输出报文解析统计数据3)流量重放整体应用识别框架可以分为三个部分:1)报文解析引擎:负责报文解析匹配,输入skb,输出flow_info,flow_info中包含匹配到的应用信息,特征库序号以及smac.然后基于次应用识别引擎开发跨平台报文分析工具,支持流量重放分析。2)策略执行器:根据报文解析引擎返回的结果对报文进行相关处理(DROP 或者 MARK)
2023-11-30 18:50:05 660
原创 【BSP开发经验】uboot gpl框架开发经验
U-Boot 的 GPL 隔离是指在 U-Boot 中,将 GPL 认为具有侵权风险的代码与非 GPL 代码分隔开来,以避免 GPL 认为有侵权风险的代码“污染”了非 GPL 代码,从而使得整个 U-Boot 项目遵守 GPL 协议,保障代码的版权和使用权。第 3 行的“.text”是段名(代码段),后面的冒号是语法要求,冒号后面的大括号里面可以填上要链接到“.text”这个段里面的所有文件,“(.text)”中的“”是通配符,表示所有输入文件的.text段都放到“.text”中。链接脚本是文本文件。
2023-11-30 15:44:11 313
原创 【网络BSP开发经验】Linux gmac驱动调试
网络设备驱动是linux内核中三大类设备驱动之一,它用来完成高层网络协议的底层数据传输及设备控制。网络设备与其他两种设备的区别:网络接口不存在于linux的文件系统中,及/dev下没有设备文件,用户通过套接口socket函数使用网络。网络除了响应来自内核的请求外,还需要处理外界的异步数据除了数据处理,网络设备还要完成地址设置、配置网络参数及流量统计等管理任务。
2023-08-29 17:52:57 2248
原创 【C/C++】C语言runtime调用技术
C语言编译后,在可执行文件中会有 。如果想要动态调用一个C函数,首先需要 根据函数名找到这个函数地址 ,然后根据函数地址进行调用。动态链接器已经提供一个 API:,可以通过函数名字拿到函数地址:从上面代码中可以看出,test方法是没有返回值和参数的。所以funcPointer只能在指向参数和返回值都是空的函数时才能正确调用到。对于有返回值和有参数的C函数,需要指明参数和返回值类型才能使用。不同的函数都有不同的参数和返回值类型,也就没办法通过一个万能的函数指针去支持所有函数的动态调用,必须要让函数的参数
2022-12-04 00:01:31 2722
原创 【Linux内核代码分析1】Linux时间子系统及HRTIMER实现
(1)嵌入式设备需要较好的电源管理策略。传统的linux会有一个周期性的时钟,即便是系统无事可做的时候也要醒来,这样导致系统不断的从低功耗(idle)状态进入高功耗的状态。这样的设计不符合电源管理的需求。(2)多媒体的应用程序需要非常精确的timer,例如为了避免视频的跳帧、音频回放中的跳动,这些需要系统提供足够精度的timer和低精度timer不同,高精度timer使用了人类的最直观的时间单位ns(低精度timer使用的tick是和内核配置相关,不够直接)。本质上linux早期时间子系统如图kerne
2022-12-03 23:55:25 1637
原创 【嵌入式Linux开发学习】基于TFTP的通用代码烧写方式
对于从事嵌入式行业的人来说,进行代码升级一定不会陌生。相对于单片机相对单一的烧写方式,嵌入式Linux开发中的烧写方式就丰富了许多。常见的比如串口烧写,USB烧写(fastboot),sd卡烧写。
2022-10-24 23:47:18 1142
原创 【嵌入式Linux开发学习】rootfs通过ramfs挂载技巧
在使用initramfs的过程中我感觉相比于传统的我们直接挂载块设备/dev/mmcblk0 /mmc/sda1 之类的挂载点来看相比于读写块设备 ,读写ram总归是会快很多的,系统性能会有所提高。可以避免一些需要频繁擦写数据的情况对于块设备的消耗,可以提升设备寿命,对于不怎么开关机长期保持上电状态的设备比如交换机,网桥之类尤其如此。
2022-10-23 02:22:46 1551
原创 【BSP开发学习6】模块符号的导入与导出以及使用模块规避GPL传染性
依据GPL 的相关规定,如果原始授权人采用GPL来发布自己的作品,那么无论该作品的任何衍生作品,都要遵从GPL 的规则,尽管你对于该衍生作品拥有著作权,但是你也不可以因此认为它是你的心血而另立新规,可谓“子子孙孙无穷尽也”。GPL 下的软件,是允许作为学习来复制使用的。由于相当多的内核符号都是以EXPORT_SYMBOL_GPL()导出的,所以历史上曾经有一些公司把内核的EXPORT_SYMBOL_GPL()直接改为EXPORT_SYMBOL(),然后将修改后的内核以GPL形式发布。,就可以方便的调用了。
2022-08-21 00:18:11 1092
原创 【BSP开发之kernel】Linux启动流程以及编译流程分析
uImage 是老版本 uboot 专用的镜像文件,uImag 是在 zImage 前面加了一个长度为 64。展开就是 @ make -f ./scripts/Makefile.build obj=$@arch/arm/kernel/vmlinux.lds 就是整个 Linux 的链接脚本。字节的“头”,这个头信息描述了该镜像文件的类型、加载位置、生成时间、大小等信息。用 objcopy 取消掉 vmlinux 中的一些其他信息。zImage 是经过 gzip 压缩后的 Image。...
2022-08-05 22:50:54 1096
原创 【BSP开发学习5】GPIO子系统
gpio_request 函数用于申请一个 GPIO 管脚,在使用一个 GPIO 之前一定要使用 gpio_request。如果不使用某个 GPIO 了,那么就可以调用 gpio_free 函数进行释放。因为权限问题,所以没有办法手动添加设备节点,也没有mdev,udev进行设备节点的管理,可以使用echo 8 > /proc/sys/kernel/printk调整打印等级。此函数用于设置某个 GPIO 的值,此函数是个宏,定义如下。所以需要手动添加设备节点。打印问题,默认打印等级很低。...
2022-08-05 22:47:44 8102 2
原创 【BSP开发学习4】Linux 内核时间管理
Linux 内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序、对于我们驱动编写者来说最常用的定时器。硬件定时器提供时钟源,时钟源的频率可以设置, 设置好以后就周期性的产生定时中断,系统使用定时中断来计时。中断周期性产生的频率就是系统频率,也叫做节拍率(tick rate)(有的资料也叫系统频率),比如 1000Hz,100Hz 等等说的就是系统节拍率。...
2022-08-05 22:46:36 752
原创 【BSP开发学习2】平台设备驱动
为什么要使用设备驱动模型我对于Linux 引入设备驱动模型的理解是就在于将一份驱动代码分成两份,一份代码是通用的也就是驱动driver ,令一份代码不是通用的会随着板子CPU的不同,发生改变。通过sys文件系统下面的目录和文件可以清楚的了解到Linux系统中的设备情况和组织关系。sysfs提供一种可以显式描述内核对象,对象属性以及对象关系的方法。树形结构中每一个目录与一个kobject对象相对应,其包含了目录的组织结构和名字等信息。在Linux系统中, kobject结构体是组成设备驱动模型的基本结构
2022-08-05 22:44:35 2333
原创 【BSP开发学习1】通用字符设备开发
8 };在 cdev 中有两个重要的成员变量:ops 和 dev,这两个就是字符设备文件操作函数集合file_operations 以及设备号 dev_t。编写字符设备驱动之前需要定义一个 cdev 结构体变量,这个变量就表示一个字符设备。...
2022-08-05 22:43:50 404
原创 【Linux开发基础知识】shell语法整理
变量定义 a=1变量引用 $a ${a}在Makefile 中 对于Makefile 变量的引用 使用Makefile 下的方式$(a)对于shell 中的变量使用$${a}数组名=(元素1 元素2 元素3 … 元素n)
2022-08-05 22:42:44 585
原创 【Linux开发基础知识】Makefile语法
预定义变量作用$*不包含扩展名的目标文件名称$+所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。$(第一个依赖文件的名称。$?所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。$@目标的完整名称。$^所有的依赖文件,以空格分开,不包含重复的依赖文件。如果Makefile中出现一些相同命令序列,那么我们可以为这些相同的命令序列定义一个变量。endef这里,“run-yacc”是这个命令包的名字,其不要和Makefile中的变量重名。...
2022-08-05 22:41:57 459
原创 【BSP开发之uboot】uboot常用命令以及代码分析
函数中通过initcall_run_list运行initcall_run_list列表中的函数,可以看一下init_sequence_r包括了各种板级的初始化,最终运行run_main_loop。第一阶段主要由start.s运行并实现相应的初始化,定义程序入口地址,初始化CPU,初始化内存,最后调用_main到第二阶段的板级别初始化部分。第二阶段主要是C语言编写,对于硬件内存分配,初始化硬件设备,串口初始化,显示设备初始化,运行环境初始化等等,最后启动内核。...
2022-08-05 22:40:42 2179
原创 【嵌入式流媒体开发】Linux ALSA 声卡数据采集与播放
文章目录ALSA框架环境搭建ALSA 交叉编译移植alsa-libalsa-util配置USB声卡查看声卡设备并测试查看音卡:录音测试播放测试音频采集常见参数WAV文件头编程实现录音的播放audio.cppaudio.haudio_wav.cppaudio_wav.h播放录音测试代码运行方式audio_recordaudio_playALSA框架ALSA 是 Advanced Linux Sound Architecture 的缩写,即高级 Linux声音架构,在 Linux 操作系统上提供了对音频和
2022-02-05 13:25:04 3130
原创 【LINUX驱动开发】AMG8833红外成像模块在HI3516上的应用
文章目录AMG8833介绍内部框图器件参数点阵的排布顺序原理图内部寄存器1、Power Control寄存器:2、Reset寄存器:4、Interrupt Control寄存器:5、Status寄存器:6、Status Clear寄存器:7、Average寄存器:8、Interrupt Level寄存器:9、Thermistor寄存器:10、Interrupt Table寄存器:11、Temperature寄存器:HI3516驱动开发测试代码最终效果![在这里插入图片描述](https://img-blog
2022-01-31 18:58:21 2390
原创 【数字图像处理】OpenCV相机标定 计算内参外参
相机标定理论四个坐标轴的变换关系:(1)从 world 到 camera(2)从camera到image(3)从 image 到 pixel(4)从world 到 pixel畸变参数(distortion parameters)在几何光学和阴极射线管(CRT)显示中,畸变(distortion) 是对直线投影(rectilinear projection)的一种偏移。简单来说直线投影是场景内的一条直线投影到图片上也保持为一条直线。那畸变简单来说就是一条直线投影到图片上不能保持为一条
2022-01-30 20:27:11 9390 2
原创 【单片机开发】OV2640在没有DCMI接口的情况下的STM32驱动
文章目录(一)背景介绍(二)接线(三)软件实现(一)背景介绍在之前刚学STM32的时候完成了一个ov7670的驱动ov7670驱动已经快要两年过去了,最近抽了一点时间又将之前搞得ov2640的驱动完善了一下看一下效果吧。(二)接线GNDSCLSDAD0D2D4D6PCLKPWDNGNDPC1PC0PA0PA2PA4PA6PB10PC33.3VSYNCHREFRSTD1D3D5D7NC3.3PC13
2021-08-12 22:35:31 4444 11
原创 【嵌入式LINUX】busybox-1.32.0 交叉编译构建文件系统会出现的问题以及解决方案
前言之前已经使用过很多其他版本的文件系统,但这都不是我们自己从零开始构建的系统今天我将使用最新的busybox构建文件系统并完成移植工作。Busybox 被誉为 Linux 工具里的“瑞士军刀”,是一个 Linux 工具集,通过一个可执行文件实现了很多标准 Linux 的命令和工具。它既包含了一些简单的工具,如 cat 和 echo,也包含了一些更大、更复杂的工具,如 grep、find、mount。Busybox 的源码可从官方主页www.busybox.net 获得,目前最新版本为 Busybox-
2021-07-10 18:56:49 727
原创 【机器人原理与实践(二)】单目摄像头标定与单目测距
文章目录摄像头标定4.1 单目相机的建模4.1.1 图像坐标系到像素坐标系的转换4.1.2相机坐标系到图像坐标系的转换4.1.3 合并矩阵4.2 固定向下摄像头标定4.3 俯视摄像头标定4.4 本章小结摄像头标定我们可以想到在单目测量中我们在图像中找到某个目标以后可以获得的是一组像素的坐标,对于这样的一组像素并没有与实际空间中的转换关系,所以我们使用视觉传感的第一步就是尝试进行视觉标定,将图像中的坐标转换为实际的坐标。摄像机标定(Camera calibration)简单来说是从世界坐标系转换为相机坐
2021-05-31 15:09:05 3562 1
原创 【机器人原理与实践(三)】六轴机械臂正逆解控制
本章针对机械臂的运动学进行建模分析。机械臂运动学模型反映的是个关节的角度与执行器末端位姿之间的映射关系。在工业过程中需要考虑的根据期望位姿推导关节角度(机械臂逆解),以及根据现有的关节角度推导末端执行器位姿(机械臂正解)。3.1 空间转换矩阵的理解3.1.1平移变换3.1.2旋转变换除了位置之外,还需要对刚体的指向,即姿态进行描述。而这也是旋转矩阵最本质的来源,即来源于 坐标系的旋转,这一部分理解不好或是理解不透彻,会导致此后面对各种形式的旋转时出现混乱,所以公式将进行详细的表述。描述姿态的
2021-05-30 23:53:01 9614 6
原创 【Jetson nano开发笔记】jetson nano 环境搭建与常见软件安装
文章目录开发板看看他香不香IO定义设置一下root密码吧更换源赶紧配置VNC已安装组件的使用cudaOpenCVcuDNNjetson nano 安装 TensorFlow GPU安装pip安装那些机器学习领域的包安装TensorFlow GPU版ROS安装什么是ROS选用ROS系统准备工作开始安装将安装源添加到source.list添加公钥和更新系统安装ROS初始化ROS将ROS配置信息写入环境变量,保证每一个终端启动时,都会自动执行setup.bash安装一些依赖包测试一下ROS是否正确安装,输入下面.
2021-05-16 21:33:40 16600 6
原创 【机器人原理与实践(一)】ROS学习笔记
文章目录常用命令放码过来Python 编程C++编程ROS的Hello World创建msg与srv文件常用命令启动ROS: roscore获取节点信息:rosnode list 列出所有正在运行的节点rosnode info xxx 列出节点信息rosnode pingrosnode machinerosnode kill运行节点rosrun XXX创建ROS功能包:roscreate-pkg XXX std_msgs rospy roscpp编译功能包 :rosmake xxx
2021-05-15 21:38:08 7064 1
原创 【数字图像处理】OpenCV3 扩展模块学习笔记
1. 特征检测方法1.1. 特征定义1.2. 角点检测原理1.2.1. Harris角点检测原理1.2.2. Tomasi角点检测原理1.2.3. SURF特征检测1.2.4. SIFT特征点检测1.2.5. HOG 特征检测1.2.6. LBP 特征提取1.2.6.1. 原始LBP1.2.6.2. 圆形LBP算子1.3. HAAR特征提取1.3.1. 1.什么是haar特征?1.3.2. 2.如何利用特征 区分目标?1.3.3. 3.如何得到这个判决?1...
2021-05-05 17:12:42 245
原创 【数字图像处理】OpenCV3 学习笔记
1. 加载保存显示图像2. 操作图像像素2.1. 方法1:使用 Mat 中对矩阵元素的地址定位的知识2.2. 方法二:使用 Mat::at 函数2.3. 方法三:使用 Mat 的一个模板子类 Mat_2.4. 方法四:使用 Mat::ptr 模板函数3. 图像掩模4. 图像线性变换4.1. 图像线性混合4.2. 图像亮度与对比度4.3. 线性模糊4.3.1. 均值模糊4.3.2. 高斯模糊5. 形态学操作5.1. 腐蚀膨胀5.2. 开闭操作5.3. 顶帽.
2021-05-05 17:10:43 1460 7
原创 【流媒体开发】树莓派开发基于RTMP的网络摄像头
文章目录(一) 预备知识关于RTMP推流1、消息2、块a、块基本头(basic header)b、块消息头(chunk msg header)3、rtmp的消息类型协议控制消息用户控制消息RTMP命令消息数据消息(Message Type=18或15)共享对象消息 (Message Type=19或16)4、实例分析rtmp传输过程(1)握手(2)建立连接(3)建立流(4)发布音视频(二)构建思路(三)编译部署SRS1. 创建文件夹 mkdir srs,将我们的项目存放在该目录下2. 下载SRS源码,这里是
2021-04-23 19:30:39 938
原创 【Linux驱动开发】PS2游戏手柄驱动开发与输入子系统框架
文章目录为什么需要输入子系统框架输入子系统框架驱动层事件处理层注册输入设备函数:注销输入设备函数:驱动实现——初始化(事件支持)驱动实现——报告事件驱动实现——报告结束关于事件报告的实现方法中断实现 常用于实体按键内核定时器实现,用于没有触发信号的输入事件PS2驱动开发硬件原理软件实现为什么需要输入子系统框架我们首先来看字符类驱动框架:1)写file_operations结构体的成员函数: .open()、.read()、.write()2)在入口函数里通过register_chrdev()创建驱动
2021-04-12 11:47:31 1167
原创 【Linux系统编程】Linux系统编程学习笔记
文章目录1. (一)系统参数以及选项1.1. getopt()1.2. getopt_long()2. (二)环境管理2.1. extern char **environ;全局变量2.2. getenv获取环境变量的值2.3. setenv设置环境变量的值3. (三)内存管理3.1. 基础理论3.2. 常见类型3.3. 内存分配库函数3.3.1. malloc3.3.2. calloc3.3.3. realloc3.3.4. free3.3.5. memset3.3.6. memcpy3.3.7. 更接近.
2021-04-10 23:46:08 350
原创 【单片机开发】STM32简易示波器开发
文章目录(一)前言(二)硬件介绍(1)MCU(2)TFT显示屏(3)按键接口(三)驱动编程(1)ADC驱动(2)LCD驱动(3)一路测试PWM(四)FFT原理(四)操作逻辑(五)操作效果0.1KHz0.2KHz0.4KHZ0.8KHz1.6KHz3.2K6.4KHz双通道(六)下载地址(一)前言还记得之前因为个人需要,又不太想花钱买示波器,实现了一个简易的示波器。这个示波器非常明显存在以下几个非常尴尬的问题:1.对于ADC数据的处理方式还是基于查询模式2.最高采样率无法控制,而且最高采样率可能都
2021-04-10 10:59:45 15314 3
原创 【LINUX驱动框架学习】Linux GPIO驱动以及底层实现方式
GPIO(通用目的输入/输出端口)是一种灵活的软件控制的数字信号。大多数的嵌入式处理器都引出一组或多组的 GPIO,并且部分普通管脚通过配置可以复用为 GPIO。利用可编程逻辑器件,或总线(如 I 2 C、SPI)转 GPIO 芯片,也可以扩展系统的 GPIO。不管是何种 GPIO,GPIOLIB 为内核和用户层都提供了标准的操作方法。GPIOLIB 的接口十分简洁。在 GPIOLIB,所有的 GPIO 都是用整形的 GPIO 编号标识。只要获得要操作 GPIO 的编号,就可以调用 GPIOLIB
2021-04-02 21:32:00 4949
原创 【嵌入式LINUX开发】交叉编译QT4.8.6与tslib1.4到IMX283平台
编译tslib(1)建立工作目录(2)编译安装tslib将下载的tslib源码复制到工作目录,并解压:$ unzip tslib-master.zip$ cd tslib-master(3)编译配置tslib,安装路径可以通过 --prefix 参数设置,这里安装到 /usr/local/tslib:$ ./autogen.sh$ ./configure CC=arm-none-linux-gnueabi-gcc CXX=arm-none-linux-gnueabi-g++ --host
2021-04-02 17:19:52 458
RCT6_OV2640.zip
2021-08-12
FFMPEG USB摄像头RTMP推流.zip
2020-04-25
mjpegclint.zip
2020-03-11
STM32 OV7670无FIFO.zip
2019-08-26
网盘资源分享.zip
2019-07-18
stm32掌上游戏机工程.zip
2019-06-14
智能小车蓝牙控制 基于stm32f103
2019-04-06
智能小车驱动程序源码
2019-04-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人