C语言
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 评论 -
嵌入式开发常用的几招调试方法
以上几个方法可以同时上,都是比较常用惯用的手段,调试手段越丰富,调试效率也就会越高。特别是遇到一些不容易出现的现象,又不能临时把自己调试想法运行出来,就可以采用前面说的办法,先把想法埋到流程中去,有需要的时候打开一下就行了,这样既能保障系统平时的执行效率不受影响,也能在关键时刻挺身而出,为你披荆斩刺!需要执行调试代码的时候,在SD卡创建一个临时文件,系统access判定文件是否存在,存在了就进去执行,为了减少次数,在执行完调试动作后就直接删除了这个临时文件,防止重入,减少系统负担。废话不多说,直接上方法。原创 2023-06-03 15:31:51 · 1372 阅读 · 0 评论 -
嵌入式图像上实现软件画线
那么久需要从在图像上直接画出来,也就是改变一下图像上的像素点的值,组成我们需要的线条的表现形式。我们知道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 评论 -
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 评论 -
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 · 2978 阅读 · 0 评论 -
C语言常见问题(10):Sections of code should not be commented out
注释掉的代码及时清理掉,让函数的body干净清洁,不要杂草丛生!原创 2022-02-22 21:58:44 · 1922 阅读 · 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 · 1921 阅读 · 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 评论 -
C语言常见问题(6):declaration shadows a local variable
粘贴复制用多了,连声明都一起copy过来了,造成了一个函数里面不同作用域里声明了同名变量,其实他们是可以共用的,这是个不好的习惯,需要防微杜渐,有时候不好查的bug的bug都是在这种熟悉得不能再熟悉的地方。...原创 2022-01-26 20:37:29 · 4264 阅读 · 0 评论 -
C语言常见问题(5):enum members other than the first one should not be explicitly initialized unless all mem
就是枚举里面的元素不是连续的,要不就只有一个赋初值的,要么就所以元素都单独赋值。这种问题我们在写代码的时候经常出现,但是确实不是那么规范,引以为戒。原创 2022-01-26 20:34:33 · 634 阅读 · 0 评论 -
C语言常见问题(2):Remove this conditional structure or edit its code blocks so that they‘re not all the sam
写if else的时候,卡条件卡得离散了一点,本身可以合成一个的,结果写成了多级if,增加了程序的复杂度。原创 2022-01-05 10:11:28 · 2716 阅读 · 0 评论 -
C语言常见问题(1):Called function pointer is null (null dereference)
Called function pointer is null (null dereference)翻译过来就是调用的函数指针为空。使用Sonar工具检测,在使用这种函数指针的时候没有先判断该函数指针是否为空,存在安全隐患,一旦为空,不就崩溃了嘛!因此,一种变通的方法就是把这个函数指针的调用封装到一个函数里面去,增加判断是否为空的检测,保障安全。后续将继续举例讲讲常见的问题。...原创 2022-01-04 21:55:51 · 1161 阅读 · 0 评论 -
C语言常见问题(4):Collapsible if statements should be merged
多级if可以合成一个if来完成的,尽量合在一起。Collapsible if statements should be merged: 应合并可折叠的if语句原创 2022-01-14 17:48:32 · 1125 阅读 · 0 评论 -
C语言常见问题(3):Although the value stored to ‘ret‘ is used in the enclosing expression
就是这个ret返回值是在if里面表达式里赋值的,其他地方没有调用这个ret,相当于这个ret是个多余的!原创 2022-01-14 17:45:55 · 610 阅读 · 0 评论 -
字符的HEX字符串转换
1 byte数字转成HEX格式很简单,用sprintf就行,%02x格式输出到指定buffer即可,从字符要转回来成1byte数字要稍微转化一下。unsigned char hex2int(char c){ if (c >= '0' && c <= '9') { return (unsigned char )(c - 48); } else if (c >= 'A' && c <= 'F') { ...原创 2022-01-05 15:52:26 · 6451 阅读 · 0 评论