- 博客(408)
- 资源 (1)
- 收藏
- 关注
原创 JSON格式,C语言自己实现,以及直接调用库函数(一)
如果没有现成的 JSON 库,要自己实现 JSON 数据的解析和生成,可以按照 JSON 数据的结构特点,通过字符串处理来完成。JSON 对象:JSON 对象由键值对组成,键和值之间用冒号 : 分隔,键值对之间用逗号 , 分隔,整体用花括号 {} 包裹。数组中的值可以是不同的数据类型,也可以是对象或数组。JSON 数组:JSON 数组由值组成,值之间用逗号 , 分隔,整体用方括号 [] 包裹。JSON 对象是由键值对组成,用花括号 {} 包裹,键和值之间用冒号 : 分隔,多个键值对之间用逗号 , 分隔。
2025-02-18 13:59:00
785
原创 MQTT(Message Queuing Telemetry Transport)协议(二)
下面为你详细介绍如何基于 TCP 协议对 MQTT 进行封装,包括实现思路、代码示例及代码解释。
2025-02-11 21:55:46
282
原创 MQTT(Message Queuing Telemetry Transport)协议(一)
在这种情况下,需要尽量减少通信开销。另外,在一些特殊场景下,如低功耗广域网(LPWAN)环境中,由于网络带宽极低且对功耗要求严格,可能需要对 MQTT 协议进行裁剪和优化,并选择合适的底层传输协议。当传输的数据包含敏感信息,如用户的个人身份信息、设备的控制密钥等,或者网络环境存在安全风险(如通过公共网络进行通信),则必须使用基于 TLS/SSL 的 TCP 协议。虽然 TLS/SSL 会增加一定的计算和带宽开销,但对于资源丰富的设备和网络来说,这些开销是可以接受的,并且能提供更好的安全性和可靠性。
2025-02-11 20:49:37
937
原创 Linux 内核,之优化启动时间
内核启动到最后,就是将文件系统挂载,挂载文件系统后,还需要将文件系统中的服务策划程序或者守护进程启动,这也会消耗一部分的时间,像linux优化一样,我们要找到需要优化的部分,在使用systemd管理文件系统的,我们就可以使用systemdt提供的一个分析工具,就可以很块的得到linux一样的图。这样,就可以根据图示的信息,使用make menuconfig重新配置kernel,该去除的去除,该模块化的模块化,重新编译内核,就可以将linux的启动耗时缩短,使我们的linux启动的时候,明显的快很多。
2024-11-10 23:59:07
1222
原创 Linux内核.之 init文件,/init/main.c
想要熟悉内核,看下源码,就非常清晰Linux内核,head.s,汇编启动cpu相关设置后,启动init文件里的,文件在内核的/init/main.c,看下main函数,做了哪些工作// SPDX-License-Identifier: GPL-2.0-only/* * linux/init/main.c * * Copyright (C) 1991, 1992 Linus Torvalds * * GK 2/5/95 - Changed to support mounting
2024-11-10 11:46:55
489
原创 Linux和,FreeRTOS 任务调度原理,r0-r15寄存器,Linux的进程管理(二)
前面我讲了,Linux和,FreeRTOS 任务调度原理,r0-r15寄存器,freertos任务管理机制。这篇,大概说下,Linux的进程管理,研究进程管理,对于学会linux是非常重要的。
2024-11-04 21:48:59
144
原创 Linux和,FreeRTOS 任务调度原理,r0-r15寄存器,以及移植freertos(一)
有了上面这两张图,是不是,比较清晰了,当发生高优先级事件,中断时,就会发生任务切换,那rtos,要和linux系统一样,可以实现进程,任务的管理,是不是要能获得cpu的管理权,能操控底层的寄存器。玩过arm架构的mcu还是soc,都知道,对进程管理,任务切换,是需要保存现场的(哪个函数被调用函数被执行到哪句代码,执行过程中,计算的局部变量的值),都是需要保存,才能返回的。写这篇文章的目的,是之前面试官,刚好问到我,移植FreeRTOS 到mcu,需要做哪些步骤,当时回答的时候,我愣了一下。
2024-11-04 20:27:19
892
原创 嵌入式发展方向(硬件,应用,驱动),职业规划选择方向。
到了后期,工资并不低,甚至比软件开发高,我同事,毕业两年混混当地,10k左右,第四年已经25k了,而我工作两年时是15k,5年后,才拿到25k,而且,后面突破比较难,并不是技术,而是大多数公司,支付不起,小公司的成本非常高,采购硬件设备,芯片,占了很大一部分,不像会联网,只需采购几台电脑。深入理解gui,qt。应用结合驱动,会配置usb,以太网,,emmc,会写lcd,接camera,touch,gui,更高级的,音视频,采集,流媒体,图像算法,可以研究OpenCV,FFmpeg,alsalib等等。
2024-10-26 23:37:14
7008
20
原创 Linux 命令.之,ps查看进程启动时间、运行时间
依次打印出某进程的pid,uid,user,启动时间,持续时间,占用CPU时间(cputime),以及cmd。注意:top 命令输出的 TIME+ 字段是进程占用 CPU 运行的时间,并非其真正的运行时间。
2024-10-26 20:11:53
689
原创 linux网络协议.之,网络底层驱动,一万字,拆解 Linux 网络包发送过程
关于网络协议栈这款,我以前学习了比较多,深入,好几年不用,又忘记了,学的东西太多了,有时候需要深入一点,大多时候不需要,所以,我的理解是除非做网络驱动的,或者深入研究协议栈,了解差不多就够用了,学了也会忘。
2024-10-26 20:09:11
138
原创 linux内核.之suspend 和resume过程trace debug
原文链接:https://dongka.github.io/2018/12/13/standby/kernel_suspend/
2024-10-26 19:59:03
181
原创 流媒体协议.之(RTP,RTCP,RTSP,RTMP,HTTP)(三)
git地址:https://github.com/ireader/media-server?推流协议库有,librtmp,librtp,jrtplib等;推流工具有,ffmepg,obs.lib,ndi等;本文,分析,贴出一些博主的关键源码。网络上也有开源的库,可以用这些。
2024-10-26 18:42:57
1341
原创 流媒体协议.之(RTP,RTCP,RTSP,RTMP,HTTP)(二)
可以看到RTP数据头,协议,非常多,没什么难度,就是多,一般我们都不会从新造轮子,网上很多大佬,开源分享,移植过来,修改就OK了,下篇,直接贴代码,封装协议,要老命,自己去手撸出来,手撸linux内核代码没必要。他用FFmpeg去对一个事先准备好的mp4文件,读取流,然后通过RTSP协议,推流到一个文件夹,然后写了个客户端,rtsp,拉流,播放。然后分一个模块,私有协议,封装有效数据,数据封装层。继续上篇介绍,本篇介绍一下封装RTP的数据格式,如何将摄像头采集的码流,音频的码流,封装到rtp里,传输。
2024-10-26 12:14:52
1686
原创 流媒体协议.之(RTP,RTCP,RTSP,RTMP,HTTP)(一)
闲着没事做,记录一下开发项目用过的协议,项目中,大多是是实时显示播放的,通过私有协议,传输到上位机,实时播放,延时小于200ms,仿照这些协议,定义的数据格式。如果用这些协议,有时延时会比较大,这些协议适合做直播,延时3s,也不会怎么样,看直播的都知道,有几秒的延时,但是实时播放,不太适合。常见的有这些协议(RTP,RTCP,RTSP,RTMP,HTTP)。RTSP方法,RTSP请求包括:OPTIONS,DESCRIBE,SETUP,PLAY,GET_PARAMETER,TEARDOWN。
2024-10-25 22:08:19
2889
原创 Linux 内核态,用户态,以及如何从内核态到用户态,交互方式有哪些
先来回想一下,内核启动时,是如何进入到用户空间的,linux启动最后,会调用start_kernel,这个函数,会调用一个kernel_init,这个就是init进程,所有用户空间的祖宗,所有进程,都是由它而创建,或它的子孙,间接创建,他是个守护进程,不会死掉,除非系统退出。用户空间,通过系统调用,陷入到内核代码工作的空间,比如(fork,pthread,创建进程,线程,read,write,open,打开读写驱动,调用了内核提供的api,就叫系统调用)中断,异常,也是一种方式,我之前忘记了,回来补充。
2024-10-13 10:58:26
803
原创 Linux,busybox构建根文件,详细讲如何,配置etc/init.d/rcS*,etc/rc.d/rc*.d,inittab,fstab(二)
交叉编译器里面有很多的库文件,这些库文件具体是做什么的我们作为初学者肯定不知道,既然我不知道那就简单粗暴的把所有的库文件都放到我们的根文件系统中。这一行表示以5为参数运行/etc/rc.d/rc,/etc/rc.d/rc是一个Shell脚本,它接受5作为参数,去执行/etc/rc.d/rc5.d/目录下的所有的rc启动脚本,/etc/rc.d/rc5.d/目录中的这些启动脚本实际上都是一些链接文件,而不是真正的rc启动脚本,真正的rc启动脚本实际上都是放在/etc/rc.d/init.d/目录下。
2024-10-11 17:23:42
1631
原创 linux系统,监控进程运行状态并自动重启崩溃后的进程的多种方法
换句话说,init 守护进程是系统上所有进程的父进程。soc的内部是有看门狗的,可以通过看门狗,检测soc,某个进程是否卡死,跑飞,如果没有及时喂狗,说明程序异常,强制重启系统。ps -aux可以看到进程的运行状态,init是个守护进程,对僵死进程进行回收,那么肯定有种方法,可以重启进程。一般大产品,如汽车,是不能完全依赖这种技术方案的,会外接一个mcu,来监控soc,通过soc发送心跳包,1。有的公司,会写monitor守护进程,监视各个进程的运行状态,异常时,自动重启,但是这种,通过一个进程。
2024-10-11 14:09:01
2253
原创 FFMpeg源码分析,关键结构体分析(一)
Ffmpeg 中 Demux 这一步是通过 avformat_open_input()这个 api 来做的,这个 api 读出文件的头部信息,并做 demux, 在此之后我们就可以读取媒体文件中的音频和视频流,然后通过 av_read_frame()从音频和视频流中读取出基本数据 流 packet,然后将 packet 送到 avcodec_decode_video2()和相对应的 api 进行解码。此时,就可以使用av_frame_unref()释放任何由 Frame 保存的参考帧并还原回最原始的状态。
2024-10-08 21:44:06
1855
原创 Linux嵌入式有发展吗,以及对uboot,kernel,rootfs的领悟
不管做应用开发,驱动开发也好,知道,系统原理,驱动框架,进程管理调度,内核竞争,信号,中断,锁,网络编程,多线程,多进程,文件管理,这些就够了。汽车行业,需要对镜像一级一级的,校验,安全启动,这部分,uboot我目前没做过,之用soc提供的,机制,制作公私钥匙,制作hash,md5,等等,然后烧录到一块加密,只能烧录一次的rom上,这样就无法篡改uboot,kernel了。第二、就是驱动外设了,lcd,emmc(公司用到再学,学了也忘记),每个厂商接的nannd,ddr,emmc,网卡,lcd等等。
2024-09-30 13:49:56
1055
原创 一文说完c++全部基础知识,IO流(二)
ostream::write 成员函数:ostream & write(char* buffer, int count);一个字节一个字节地读写,不如一次读写一片内存区域快。每次读写的字节数最好是 512 的整数倍。流、一连串连续不断的数据集合。
2024-09-29 14:33:13
513
原创 一文说完c++全部基础知识,类,多态,继承,虚函数,友元,构造,重载(一)
所以void(Person::*pfun)()意思,就死pfun是个指针,指向这个函数,这个指针类型是person类,类型,这个函数返回值是void型。和Java、C#不同的是,C++中public、private、protected只能修饰类的成员,不能修饰类,C++中的类没有共有私有之分。(p.*pfun)()的意思,先解析解引用pfun,是show,(p.*pfun)()等同于Ptr2 ->show()其实类似于C语言的结构体,头指针,这个头,就是一段内存地址的首地址,有了头,就可以访问到所有地址。
2024-09-28 21:29:31
517
原创 s5pv210(SD卡,fastboot、dd,nand write,mmc write,tftp,dnw)方式刷机,以及led裸机例子(二)
很多人,说韦东山比他讲的好,确实。这是我现在猜想的,芯片商提供的工具,为啥没有手动分区,怎么烧录的,今天明白了,他们其实都会调用写好的脚步文件,根据配置,进行文区的,linux的烧录时,编译后会生成一个文件,或直接读取dts配置文件,有分区大小,镜像名字,offset,ro可读可写配置等等。或者,uboot有mtd分区功能,估计是这么用的,提供分区信息,uboot,kernel,fs分区,起始地址,分区大小,uboot从sd卡启动,被读到ddr时,会根据这些信息,来多emmc,nand分区,固化程序。
2024-09-27 11:25:36
1065
原创 一文介绍完uboot,以tag结构体的方式给内核传参,cmdline,bootargs,以及uboot如何启动内核(三)
其中bd->bi_boot_params就是所有tag结构体所在的首地址,这个地址是保存在全局变量gd->bd中的,在uboot启动的前期会指定内存地址用于存放tag结构体,然后在启动内核的时候传给内核,内核拿到地址就会从该地址去遍历tag结构体,内核会判断tag的类型,如果是ATAG_CORE类型的tag则是起始的tag,如果是ATAG_NONE则是最后一个tag结构体,不用再往后遍历。uboot(universal boot)是通用的启动代码,支持多种架构的CPU,并且是开源的。
2024-09-25 15:09:04
713
原创 Linux驱动.之MT7601,USB-WiFi网卡移植到X210开发板,wpa_supplicant,ap,station(一)
(1)在x210_usb-wifi/DPO_MT7601U_LinuxSTA_3.0.0.4_20130913/os/linux/config.mk文件中,搜索“HAS_WPA_SUPPLICANT”,确保“HAS_WPA_SUPPLICANT=y”。抄的一个博主的,说为啥这些设置不起效,dns不起效,什么的,这种太简单了,这里不说了,件/etc/resolv.conf,这几个文件,可以自己搜索一下,没什么难度。我在华为调试wifi的时候,是有做成几个问题,开机启动,来进行配置的,忘记怎么写的了。
2024-09-22 21:42:58
1791
1
转载 嵌入式linux系统快速启动优化的方法思路
原文链接:https://blog.youkuaiyun.com/weixin_42031299/article/details/128810365。
2024-09-22 17:49:11
1121
原创 bootarg bootcmd bootm,uboot给kernel传参原理
bootarg bootcmd bootm,uboot给kernel传参原理。
2024-09-22 16:16:19
127
原创 Linux,uboot,kernel启动流程,S5PV210芯片的启动流程,DRAM控制器初始化流程
S5PV210内部有 iROM 和 iRAM,因此启动时分两个阶段:内部启动阶段和外部启动阶段。对于内部启动阶段各种S5PV210的开发板都是相同的,对于外部启动阶段,不同开发板会有不同。因为 iROM 可以使 SOC 从各种外设启动,因此可以省下一块 boot rom(专门用来启动的rom,一般是norflash)SoC 中第一启动介质故障而导致不能启动时,可以从备用启动介质启动。如果成功,BL1开始。拷贝BL1后,将复制的BL1的iROM数据求和,并将其与BL1头数据中的校验和数据进行比较。
2024-09-22 16:08:07
1649
原创 Linux驱动.之framebufer,lcd,应用层按触摸进行翻页,画图显示bmp,jpeg,png图片(二)
bmp.h#ifndef __BMP_H__#define __BMP_H__// BMP 文件头typedef struct { // unsigned short bfType; // 2 unsigned long bfSize; // 4 unsigned short bfReserved1; unsigned short bfReserved2;
2024-09-21 21:59:15
1031
原创 Linux启动流程,0,1,2进程,init进程,idle进程,内核态到用户态的kernel_execve(一)
api系统调用如,read,open,等等。shell命令也可以如ls,cat,等等。=是,如果定义了,就按Makefile的,如果如下make编译时,就按如下。一生二,二生三,三生万物,生出很好应用程序。运行用户空间的进程1,跟文件下的,init。进程0在用户空间看不到,因为他是内核进程。如果没有linuxrc,就指向下面备用的。进程2就是守护进程,维护内涵运转的。
2024-09-21 14:42:22
293
原创 FreeRTOS,Linux系统,的调度原理,与区别(一)
Linux 适用于通用计算机系统,如服务器、桌面电脑等,这些系统需要同时运行多个不同类型的程序,包括用户应用程序、系统服务等,对资源的公平分配和多种任务类型的支持要求较高。闲着没事,分享一下,FreeRTOS,与Linux的区别,以及调度的区别,开发过程中,搞Linux就搞Linux,freertos就freertos。两个是不一样的东西。Linux一般用在复杂的系统,决策,文件操作,网络操作,算法等等场景,如安防摄像头,智能汽车。用在实时性要求高的场合,如汽车,我做过的产品有智能手表,行车记录仪。
2024-09-21 11:23:35
602
原创 Uboot(手动,自动)对emmc或nand分区,格式挂载,烧录镜像的原理,以及SD卡固化镜像原理
所以是不是自动分区,就是写死在uboot里,mtdparts,uboot在ddr起来后,就可以根据这份表,自动进行分区,并读取外插入的sd卡,烧录uboot,kernel,fs到对应的分区。如下mount /dev/mmcblk0p1 /vm1这种,mmcblk0p1 是没有烧录镜像的,否则挂载写了文件,保存了会破坏掉分区uboot的,如果不是玩,是不允许这么玩的,kernel启动后,应该也是不允许这么挂载uboot分区,mmcblk0p1应该是uboot分区。关于原理前面文章有详细说明。
2024-09-18 20:35:30
4634
原创 Linux驱动.之中断系统,裸机下设置寄存器,绑定中断处理函数hander(二)
不同的中断源对应不同的中断处理函数,I.MX6U有160个中断源,所以需要160个中断处理函数,我们可以将这些中断处理函数放到一个数组里面,中断处理函数在数组中的标号就是其对应的中断号。一个中断源就需要一个sys_irq_handle_t变量,I.MX6U有160个中断源,因此需要160个sys_irq_handle_t组成中断处理数组。第17行定了中断服务函数数组irqTable,这是一个sys_irq_handle_t类型的结构体数组,数组大小为I.MX6U的中断源个数,即160个。
2024-09-16 16:25:24
1314
原创 linux网络编程之.sendto,rcvfrom,read write,send,recv的区别
linux网络编程之.sendto,rcvfrom,read write,send,recv的区别。
2024-09-15 09:33:07
186
原创 Linux驱动.之platform平台总线驱动框架(二),正点原子
第五十四章 platform设备驱动实验我们在前面几章编写的设备驱动都非常的简单,都是对IO进行最简单的读写操作。像I2C、SPI、LCD等这些复杂外设的驱动就不能这么去写了,Linux系统要考虑到驱动的可重用性,因此提出了驱动的分离与分层这样的软件思路,在这个思路下诞生了我们将来最常打交道的platform设备驱动,也叫做平台设备驱动。本章我们就来学习一下Linux下的驱动分离与分层,以及platform框架下的设备驱动该如何编写。54.1 Linux驱动的分离与分层54.1.1 驱动的分隔与分离
2024-09-13 18:38:26
1025
原创 Linux下控制GPIO的三种方法
https://blog.youkuaiyun.com/qq_41076734/article/details/124669908
2024-09-09 22:21:26
185
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人