- 博客(221)
- 收藏
- 关注
原创 软件运行原理 - 内存模型 - 栈内存
说明C/C++软件运行时,内存根据使用方式的不同分为堆内存和栈内存,栈内存使用有以下特征:栈内存使用(申请、释放)由系统自动分配和释放,程序员不用做任何操作。栈内存重复使用,进入函数时数据入栈,函数执行完数据出栈。函数中的局部变量以及实参保存在栈内存中。内存模型栈内存处于进程虚拟内存的高地址,从高往低扩展。堆内存处于进程虚拟内存的低地址,从低往高扩展。原理在数据结构领域,栈是一种仅在尾部进行插入或删除操作的线性表,以后进先出的规则管理数据,先进入的数据被压入栈底,最后的
2023-12-11 22:41:42 129
原创 Linux - 驱动开发 - watchdog - SMP机制下多核确活
【代码】Linux - 驱动开发 - watchdog - SMP机制下多核确活。
2023-11-13 19:26:41 521
原创 ARMv8 - 安全机制(TrustZone) - 异常等级
允许操作系统(EL1)请求虚拟化(EL2)服务当在ARMv8-A架构下,normal world, EL1尝试去访问EL2的时候,则会陷入到虚拟化层的,其中是通过HVC指令HVC指令用于生成同步异常,该异常由EL2中运行的管理程序处理。参数和返回值通过寄存器传递,虚拟机监控程序还可以捕获住操作系统(EL1中的guest os)发出的SMC call,并且支持SMC call被模仿、传递给下一级或拒绝通过。汇编指令SMC(Secure Monite
2023-06-29 16:56:13 1418
原创 c语言缺陷 - 函数声明和定义,参数不一致校验缺失
背景使用C语言开发时常会遇到以下问题:多次修改导致代码文件(.c)中的函数定义的参数个数/类型与头文件中的函数声明不一致,编译器无法检测出来,即使是开启了严格的编译选项(-Wall -Werror),如下:* test.hint test(int a);* test.c#include <stdio.h>int test(int a, int b){ a = 1; b = 2; ....}* main.c#include <stdio.
2022-05-11 16:45:57 1987
原创 cpu cache flush 和 内存 invalidate
背景嵌入式开发中遇到问题:将SD卡中某个文件读取到一块内存中,再将该内存地址发送给外设硬件,硬件通过该地址读取数据做处理,处理结果异常,并且现象有以下规律:通过代码实现将SD卡中的文件数据拷贝到新文件中,文件是正常的。外设硬件处理前,先使用代码使用一次该块内存,即使是简单的打印,处理结果也是正常的。问题分析从问题现象很容易会想到和缓存有关,但是应用层/OS创建的DDR缓存还是cpu L1/L2/L3 cache需要确认下,最终该问题测试验证是cpu cache导致的。嵌入式开发中,cp
2022-05-11 11:05:31 2445
原创 Linux 应用 - 动态库 - 内存占用
背景在小内存(64M)嵌入式Linux平台上开发中遇到以下两个现象验证公版程序,由于程序文件较大,设备flash中放不下,测试时需要将部分动态库放在SD卡中,插上SD卡,添加SD卡路径到动态库查找路径后再执行程序;程序支持SD卡录像功能,测试录像功能时,在录像过程中拔掉SD卡,程序必现bus err崩溃问题,gdb定位到的错误代码是随机的,但是大部分是保存在SD卡中的动态库中的代码,如果不拔卡能够稳定运行,如果不放动态库在SD中,程序也不会有问题,只是录像写文件会失败。裁减公版程序,程序功能裁减
2022-03-25 18:41:54 3703
原创 linux - 内核 - io子系统 - io调度
背景在嵌入式平台实现行车记录仪等产品的录像功能(使用SD卡存储)时,性能普通,研究确认IO调度是否能提升性能。调度说明在linux平台以普通方式(缓存io)读写文件,读写请求并不是直接发给存储设备处理,操作系统会先将请求(包含数据)缓存起来,经过算法调度和处理(合并、排序请求)后,再发送请求到存储设备。为何需要调度算法IO请求较多以及来源(请求发起进程)比较复杂时。为了保证所有IO请求能够以相对公平的方式得到执行,从而产生的优先级问题。为了尽可能的提高性能,需要配合缓存机制实现一
2022-03-21 21:45:48 812
原创 自动化构建 - make&Makefile - recipe 执行原理
背景在Makefile recipe中执行另外一个目录下的Makefile,图简单使用了cd命令,但是测试发现cd命令未生效,示例代码如下:test: cd workspace make cd -常规做法是使用-C选项,如下,test: make -C workspace以上代码首先会切换到workspace目录,再执行此目录下的Makefile,且会有以下打印,workspace下的Makefile执行完后,会切换回原来的目录和Makefile。
2022-03-10 20:51:09 341
原创 行车记录仪 - 录像 - 文件缓存
背景基于ffmpeg实现录像功能,性能不理想,前后路摄像头视频码率相加只有28Mbps加上音频也只有4MB/s左右,使用class 10的sd卡 + 2秒 ringbuffer缓存的情况下,依然出现写卡不及时导致的丢帧现象,class 4 sd卡表现更差。分析使用dd命令测试class 10 SD卡在该平台上的读写速度,写速度能达到7~8MB/s,因此丢帧问题不是SD卡写性能不足导致的,是录像逻辑的问题。通过测试定位到ffmpeg接口av_write_frame(写一帧数据)耗时异常,异常部分
2022-03-08 17:35:44 1881
原创 行车记录仪 - 录像 - ffmpeg AVPacket 复用
说明基于ffmpeg实现录像功能,写每一帧数据都需要生成一个AVPacket变量传递给av_write_frame,常见流程如下:av_new_packet函数中需要申请一定大小的内存空间存储媒体数据,av_write_frame执行完后再需要使用av_packet_free释放内存空间,在行车记录仪产品大码率,较高帧率,长时间录制的环境下,该循环操作对性能的影响不容忽视,生成AVPacket实测耗时如下:01-01 08:02:13.393 230 478 I get_pack
2022-01-07 15:52:05 753
原创 文件io - 操纵文件空间 - fallocate
说明以普通方式(缓存io)写文件,由于无法预知文件的最终size(即所需磁盘块个数),操作系统无法提前申请好磁盘空间只能按需分配,当系统进程将缓存脏页写入磁盘时,发现内存页没有对应的磁盘空间(磁盘块),系统会触发中断,向存储器申请分配一块,再将数据写入存储器中。磁盘空间预分配:按照用户需求提前分配好磁盘空间(一定数量的磁盘块)。使用录像预分配,以加快录像存储的速度。加速原理减少查找可用块的时间损耗按需分配磁盘块时,每次申请一块磁盘块,申请时存储器需要查找可用磁盘块,需要耗费一定的
2021-12-11 17:14:57 1076 2
原创 H26x 编解码 - GOP 模式
GOP 简介GOP(Group Of Picture),在互联网流媒体领域也被称为 GOF(Group of frame)。H26x编解码中视频帧分为I帧(关键帧)、P帧(参考帧)等,P帧等依赖于I帧,视频帧可以以I帧为第一帧的组形式划分的。GOP值也是I帧的间隔帧数。智能编码技术市场上售卖的安防产品时常会声称支持smartH264,smartH265,smartH264++,smartH265++等技术,实际上就是智能编码技术,很大部分是在GOP上做文章。智能编码技术的目的:降低码率,低
2021-09-26 21:22:42 1892
原创 c/c++ 32/64位兼容编程
说明在工作(芯片设计公司开发)中,使用到的平台较多,交叉编译工具链有32位的也有64位的。所谓32位/64位是硬件层次的概念,是指处理单元的三大总线(数据总线,控制总线,地址总线)是32根导线还是64根导线,每一根导线可以传输1位数据,所以是32位和64位,64位的cpu可以在软件层次兼容32位程序,安装32位系统也能跑32位程序,但是32位的cpu当前无法兼容64位的程序,理论上软件也能实现兼容,但是好像没有必要性。编程方面,希望程序能够兼容32位和64位,这样换平台只需要重新编译就好了,不需要进
2021-09-03 21:48:28 2507
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人