嵌入式
coding码场
毕业十几年都是从事嵌入式系统开发,熟悉Linux、freeRTOS、Android,参与了HDTV、智能手机平板电脑、车载导航、扫地机方面的开发工作,主要负责系统、驱动方面的工作,应用系统也做过一些,做过高工、架构师、带过团队,先后发表过多篇学术论文,已通过软考项目管理师,熟悉IATF16949,CMMI,市工信局项目评审和验收专家。目前在芯片原厂从事嵌入式系统开发。
展开
-
基于libcurl+libopenssl开源库编译出curl下载工具及代码集成curl功能
由于使用的是32bit的编译器,因此makefile里面产生的-m64需要去掉一下,等待编译完成后再安装,执行make install;指定好openssl的头文件,库路径,编译器CC的全路径,CXX也配置上,其他就是一些小配置,--prefix是库文件和可执行文件输出的地方;CC就是编译器的路径, --prefix就是编译出的库文件及可执行文件存放的位置;配置好,执行make,再执行make install,等待完成即可;如果需要编程的来写下载程序的,可以调用curl的接口。:编译openssl。原创 2023-11-18 20:35:58 · 489 阅读 · 0 评论 -
内存CACHE同步引起OSD时间戳显示异常
实验的时候,我们把做翻转的动作给取消了,相当于不翻转,图像只是倒立而已,但是做翻转的接口又是调用的OPENCV的接口,这种接口也不大可能出问题,再说它能完成一次就有理由说明人家这个翻转接口功能没问题,这种是纯软件的接口,经久耐用的接口我们应该还是信任的,那就剩OSD画布的内存同步了,怀疑是内存同步的问题。马上做了一个实验,改完非CACHED的,我们怀疑是在OSD重新排序的时候,把OSD画布内容做翻转不成功,因此做了一个实验,就是只设置一次OSD,后期时间戳不刷新,显示是正常的,只不过是倒立的,原创 2023-10-24 18:17:40 · 480 阅读 · 0 评论 -
打印编译程序固件的环境信息
SVN的提交号,当然利用shell命令可以完成很多丰富信息的组合和叠加,拼接完信息后,只需要通过echo到一个指定的文件就可以,在程序启动的地方来引用这个动态生成的编译信息。方法都不难,有一些这样的编译信息,会给我们一个清晰的信息指引,对定位问题和不弄错软件版本都有好处。有些公司还会把编译时的代码提交点给打印出来,比如git的最新一个commit ID,软件运行的时候就会先打印编译日期,再打印时间点,这种比较简单易用;通过定义一个头文件的宏来表示着编译相关的信息集合;原创 2023-10-15 16:10:43 · 291 阅读 · 0 评论 -
利用procrank和lsof定位出客户软件内存OOM的问题
在我们释放SDK出来的时候也会有固件测试整体功能的,客户修改了自己的东西后,开发的程序跑起来十来分钟就oom了.我方leader跟客户对接呢又不那么自信似的,客户在群里反复抱怨程序有内存泄露. 我们在公司内也组织了再次内测,跑两天都没有任何内存泄露,因此我们建议客户在我们SDK的基础上,做增量的问题定位,把修改过的代码一点点加到原始SDK上去定位. 你猜现在客户都多牛逼,人家不干,拍着胸脯说我们改过的代码100%没有内存泄露,我们没有申请内存,客户反正就是不想去回退代码定位.猛的一回头,可疑分子来了,原创 2023-09-09 19:09:37 · 321 阅读 · 0 评论 -
嵌入式开发常用的几招调试方法
以上几个方法可以同时上,都是比较常用惯用的手段,调试手段越丰富,调试效率也就会越高。特别是遇到一些不容易出现的现象,又不能临时把自己调试想法运行出来,就可以采用前面说的办法,先把想法埋到流程中去,有需要的时候打开一下就行了,这样既能保障系统平时的执行效率不受影响,也能在关键时刻挺身而出,为你披荆斩刺!需要执行调试代码的时候,在SD卡创建一个临时文件,系统access判定文件是否存在,存在了就进去执行,为了减少次数,在执行完调试动作后就直接删除了这个临时文件,防止重入,减少系统负担。废话不多说,直接上方法。原创 2023-06-03 15:31:51 · 1372 阅读 · 0 评论 -
git分支上的tag
在发布一个版本时,我们通常先在版本库中打一个标签,这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。在回退版本的时候,相当有用!那怎么用呢? 一、在分支上线打tag 1. 在最新代码上打tag; 这种情况最简单,就是在pull下来最新的代码基础上打一下tag,无需指定commit id,系统会默认最新的这个commit id。打tag需要取一个tag的名字,还得同步写一个tag的message,也就原创 2022-12-04 11:57:38 · 5278 阅读 · 1 评论 -
嵌入式图像上实现软件画线
那么久需要从在图像上直接画出来,也就是改变一下图像上的像素点的值,组成我们需要的线条的表现形式。我们知道YUV420SP的图像有两个plane,Y在一个plane上,uv在另外一个plane上,比起uv的plane大小只有Y的一半大小,那么我们在要替换相应像素点的yuv值得时候就可以找到对应的Y和UV的值。从替换点的yuv值我们可以看出,ImgH,ImgW是图像的宽高, PntY,PntX就是具体像素点位置,要有一个颜色的对应值,支持的颜色多了,我们弄一个颜色对照表,把主要颜色支持上就行了。原创 2022-10-28 21:00:39 · 743 阅读 · 0 评论 -
动态数组用一级指针还是二级指针?
在使用中,每次添加的任务数又是不大一样的,那么我们怎么存储好任务数据呢?一级指针好处,你要存储多少个成员就申请多少个NODE空间,后面再要添加的时候,就采用remalloc的方式来解决。我的建议,在买个NODE内存单元不大的情况下,采用一级指针更好一些。弊端操作麻烦,查找效率不高,要先申请存放指针的空间,然后再去申请NODE的空间,相对麻烦一些。弊端需要连续的空间,如果需要大块大块的,可能有remalloc失败的风险。二级指针好处可以利用一些零碎一点的空间,不需要很大的一块连续空间;...原创 2022-07-20 20:55:44 · 256 阅读 · 0 评论 -
GPU工作任务存储内存快动态调整兼顾效率
VGS 是视频图形子系统,全称为 Video Graphics Sub-System。支持对一幅输入图像进行处理,如进行缩放、像素格式转换、视频存储格式转换、压缩/解压、打 COVER、打 OSD、画线、旋转、动态范围转换等处理。通常都是GPU来干的,以GPU要干一下用户指定的任务时是一批任务,每次需要完成的任务量又是不固定的,比如拿GPU来给一张输入图片做旋转、裁剪、拉伸、镜像、上下翻折、贴个LOGO、盖个色块、等操作,需要用一个内存块来记录一下这些任务。 对GPU来说,每一个操作都是一个ta原创 2022-06-25 16:03:41 · 416 阅读 · 0 评论 -
指针地址和结构体中的数组
看看指针和结构体中的数组怎么用的,很基础的,搞清楚一点好。#include <stdio.h>#include <stdlib.h>#include <stdint.h>#include <stdbool.h>#include <stddef.h>#include <unistd.h>#include <fcntl.h>#include <string.h>#include <ctyp原创 2022-05-24 20:57:56 · 237 阅读 · 0 评论 -
获取BMP图像的信息简易例子
文件头typedef struct tag_OSD_BITMAPFILEHEADER{ HI_U32 bfSize; HI_U16 bfReserved1; HI_U16 bfReserved2; HI_U32 bfOffBits;} OSD_BITMAPFILEHEADER;typedef struct tag_OSD_BITMAPINFO{ OSD_BITMAPINFOHEADER bmiHeader; OSD_原创 2022-05-21 15:04:41 · 465 阅读 · 0 评论 -
checkpatch海思SDK代码遇见的常见错误《二》
17) ERROR:OPEN_BRACE: open brace '{' following enum go on the same line左大括号要跟enum同一行。18)WARNING:LONG_LINE: line over 120 characters这个最简单了,就是超出了最大长度120个字符,但是有时候需要注意,TAB键输入比较多的情况下,即使最后一个字符的COL没有到120,也会报,因为TAB占的多,有些是8个字符宽度。19)WARNING:USE_FUNC: __f原创 2022-05-20 21:03:52 · 908 阅读 · 0 评论 -
checkpatch海思SDK代码遇见的常见错误《一》
01)WARNING:AVOID_EXTERNS: externs should be avoided in .c files#3: FILE: sample/region/sample_region.c:3:+extern "C" {-#ifdef __cplusplus-#if __cplusplus-extern "C" {-#endif-#endif /* End of #ifdef __cplusplus */-02)ERROR:POINTER_LOCATION: .原创 2022-05-19 20:53:24 · 4395 阅读 · 0 评论 -
代码质量管理工具--checkpatch
代码质量,关乎软件的稳定性和生命力,能不能给客户提供持续优良的服务!说起来,大家都在做软件开发,代码质量在大多数公司都还是一个口头强调,实际放开的一个状态。有时候,我也给团队培训代码质量规范,这样写,那样写,会上大家感觉也很有用,会后持续的效果又不大好,那时候还比较勤奋,经常去review同事们提交的代码,我们在项目会议上也拿出来分析,哪里写得不错,哪里那样写不规范,时间长了大家的水平就提高了一些,但是后面新来的同事因为没有经历过这样的一个阶段,往往写的代码达不到要求,项目急得时候就直接pus...原创 2022-05-18 16:34:18 · 1838 阅读 · 0 评论 -
LINUX bash shell脚本常用的选择功能
一、选择语句case in选择语句功能常用的有if-else, case in。 case $target in uboot) cleanUboot ;; kernel) cleanKernel ;; libs) buildLibs clean ;; "") ...原创 2022-05-17 20:42:38 · 735 阅读 · 0 评论 -
学习海思Hi3516的调试方法【远程登陆和推送程序】
Hi3516开发板已经支持了telnet和tftp协议,在调试中可以远程支持登陆调试,推送调试程序;1.远程登陆开发板,需要支持telnet协议;可以使用支持telnet的桌面工具,比如mobaxterm,手上的开发板IP地址:192.168.1.32, 配置如下:2. 推送调试程序到开发板,使用tftp协议;可以使用tftpd32这个工具,比较好用,配置简单,使用方便,PC的IP【192.168.1.26】...原创 2022-05-08 16:21:10 · 999 阅读 · 0 评论 -
C语言常见问题(11):a label can only be part of a statement and a declaration is not a statement
a label can only be part of a statement and a declaration is not a statement 【 标签只能是语句的一部分,而声明不是语句】 由于switch的几个case语句在同一个作用域(因为case 语句只是标签,它们共属于一个swtich语句块),所以如果在某个case下面声明变量的话,对象的作用域是在俩个花括号之间 也就是整个switch语句,其他的case语句也能看到,这样的话就可能导致错误。我们可以通过在case后面的语...原创 2022-04-06 21:08:17 · 2979 阅读 · 0 评论 -
C语言常见问题(10):Sections of code should not be commented out
注释掉的代码及时清理掉,让函数的body干净清洁,不要杂草丛生!原创 2022-02-22 21:58:44 · 1923 阅读 · 0 评论 -
C语言常见问题(9):Value stored to ret is never read
意思就是有些变量中间的赋值没有使用到,相当于是个无效的处理,在程序设计中我们要尽力避免这样的无用功。原创 2022-02-22 21:48:16 · 1552 阅读 · 0 评论 -
C语言常见问题(8):Refactor this function to reduce its Cognitive Complexity from 43 to the 25 allowed
函数写得越复杂越绕,它的复杂度就越高,表面上看起来技术含量很高,在实际开发中经常会导致代码可读性差,别人来接手或学习这一块代码的时候头容易痛。身为程序员,都不大喜欢去接手别人的代码,为啥?因为怕代码写得太烂,伤脑筋。如果程序写得条理清晰,可读性好,代码风格又整齐划一,看起来就很美,阅读起来就没那么费劲,也就不会那样在心里埋怨这个代码的创造者。言归正传,代码复杂度通常来说尽力不要超出25,也就是说分支太多,条件太多会导致程序读起来费劲,如果函数实在比较复杂,就把能抽象的封装成子函数,降低函数内部的复杂度很..原创 2022-02-22 21:45:20 · 1922 阅读 · 0 评论 -
不到百行Demo看清MQTT收发处理逻辑
这是比较简洁的mqtt处理的demo,核心处理收的就是一个回调函数messageArrived,发送和接收是不同topic的,发送其实核心就一个MQTTPublish,但是外围组织数据的逻辑靠自己业务特色来弄了,这个例子基本能搞明白MQTT咋整起来,收到数据的解析和发送数据的组织都是可以在这个基础上展开,相对没那么难搞了。原创 2022-02-08 11:43:37 · 876 阅读 · 0 评论 -
C语言常见问题(7):Remove this redundant cast
简单说就是做了无用功,类型强制转换的类型跟声明的类型是一样的,加上了这个强制转换其实就是脱了裤子放屁。原创 2022-02-07 17:17:03 · 1193 阅读 · 0 评论 -
嵌入式MQTT连接主要流程
MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。 初始化mqtt流程:然后判断网络连接情况,确保网络是连接的;然后启动mqtt connect,配置好协议版本,username, password,clientid连接成...原创 2022-02-07 17:11:21 · 4802 阅读 · 0 评论