自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 问答 (1)
  • 收藏
  • 关注

原创 【Linux驱动篇】LCD背光驱动分析

Linux液晶背光驱动控制

2023-07-23 13:35:44 3290

原创 C语言实现任意时间戳和时间的相互转换

C语言计算任意时间和时间戳的相互转换

2023-05-12 10:01:55 3317

原创 【Linux驱动篇】同步机制(3)—信号量

信号量同互斥锁类似,也是Linux操作系统中典型的同步手段,信号量的值可以是0、1或者n。①当值为0时,代表没有可获得的信号量,当前进程则会进入睡眠状态,排入信号量的等待队列,直到有进程释放信号量,②当值大于0时,代表有多余的信号量,此时进程成功获取信号量,不会进入睡眠状态。

2023-04-14 11:41:50 2058

原创 【Linux驱动篇】4.19内核移植logcat

讲述linux4.x内核如何在驱动层和应用层移植logcat

2022-12-10 13:28:58 2885

原创 【Linux驱动篇】同步机制(2)— 互斥锁

Linux驱动相关的简单笔记知识

2022-08-07 18:25:20 5150

原创 【Linux驱动篇】同步机制(1)— 自旋锁

一、概述  自旋锁是内核编程中常见的上锁方式。对于自旋锁spinlock_t,若A上锁后,B获取锁,此时B会在原地等待,不会释放CPU,直到A释放互斥锁,B才能获得锁。二、自旋锁  自旋锁属于忙等待的方式,所以适用于临界区耗时很短的情况。自旋锁主要针对SMP(对称多处理器)或单CPU但内核可抢占的情况,对于单CPU和内核不支持抢占的系统,自旋锁退化为空操作。//定义自旋锁spinlock_t lock;//初始化自旋锁spin_lock_init(&lock);//获得自旋锁s

2022-01-20 23:54:03 7160

原创 【Linux驱动篇】长延时、短延时和睡眠延时

一、长延时msecs_to_jiffies(msec); //将毫秒数转换为jiffies数timer_before(a, b);timer_after(b, a);二、短延时udelay(unsigned long usecs);ndelay(unsigned long nsecs);mdelay(unsigned long msecs);以上三个都是忙等待,类似于while(time){time–;}会一直占用CPU,所以对于毫秒级mdelay函数不建议使用,转而使用msleep函数

2022-01-19 00:04:37 6473

原创 【Linux驱动篇】内核中断的四种实现机制

一、中断  中断分为上半部和底半部。上半部也就是硬中断,软中断只是底半部的一种实现机制  上半部主要处理有严格时限的工作,比如读取寄存的中断状态,清除中断标志,将底半部处理程序挂到底半部的执行队列中去底半部执行大部分耗时的工作,并且可以被其他中断打断  1、硬中断是由硬件产生的,比如,像磁盘,网卡,键盘,时钟等。每个设备或设备集都有它自己的IRQ(中断请求)。基于IRQ,CPU可以将相应的请求分发到对应的硬件驱动上(注:硬件驱动通常是内核中的一个子程序,而不是一个独立的进程)  2、软中断是一组静

2022-01-16 15:27:20 10862

原创 ffmpeg代码实现h264转yuv

ffmpeg代码实现h264转yuv已测试过接口稳定性,无内存泄漏int h264_to_yuv420p(char* input_file, char* output_file){ if(input_file == NULL || output_file == NULL) { return -1; } char* in_file = input_file; char* out_file = output_file; AVFormatContext *fmt_ctx = NULL;

2021-12-08 16:06:25 5198

转载 C语言裁剪YUV指定区域

/*----------------------------------------------------------------------------------------------------------- @brief : YUV420数据的存储方式有两类:planar和packed。 该函数裁剪一个对于planar的YUV420格式,读取指定区域的数据, 并保存为一个新的YUV420格式RAW。 首先指定的新的宽高必须是4的整倍数,不然新图像

2021-06-05 15:58:32 4825

原创 Linux下使用backtrace捕获死机堆栈信息

Linux下使用backtrace捕获死机堆栈信息Linux信号量代码捕获注意事项打印信号字符串Linux信号量linux下常见的死机信号,如下:信号名编号值描述系统默认处理方式SIGINT2正常终止进程(ctrl + c)终止进程SIGQUIT3异常终止进程终止进程,并允许产生core文件SIGABRT6异常终止进程终止进程,并允许产生core文件SIGBUS7异常终止进程,硬件错误终止进程,并允许产生core文件SIGFPE

2021-03-13 14:41:24 4390

原创 Valgrind内存检测工具的整理-持续更新

Valgrind内存检测工具的使用下载安装调用方式[command-line]参数介绍[valgrind-options]工具模块注意事项局限本文对Valgrind内存检测工具的使用方法作一个简单的记录,其内容大部分来自官方手册,将持续更新,建议收藏。下载源码链接:https://www.valgrind.org/downloads/current.html.手册下载:https://www.valgrind.org/docs/download_docs.html.安装./autogen,

2021-01-24 17:25:35 2333

原创 C语言编译警告和报错整理-持续更新

本帖总结编译出现的各种warnning和error的原因,持续更新。对本帖中出现的示例函数作个简单的说明:get_char_pointer() : 返回一个char*类型。下面开始记录各种编译警告和错误警告:pointless comparison of unsigned integer with a negative constant大意为:一个无意义的比较在无符号整型和一个负数常量。警告:implicit declaration of function ‘xxxxxxx’代表隐式声

2021-01-17 11:01:58 11555 3

原创 记一次gdb调试segmentation fault

程序运行时,遇到segmentation fault,但是又没有打印到底是哪一行出现的问题,于是想到通过gdb断点调试的方法来看看,能不能找出位置。本次用到的gdb命令:break 行号 : 在具体的行号加一个断点break filename:[line/function] :在文件filename的某行或某个函数处设置断点info break:显示已经打过的断点信息step:执行一行源程序代码,如果此行代码中有函数调用,则进入该函数continue:继续执行被调试程序,直至下一个断点或程序

2021-01-09 13:18:44 1750

原创 浅析一级指针和二级指针、一维数组和二维数组

1、说起指针之前,先来看看下面这个例子。#include <stdio.h>#include <stdlib.h>int malloc_pointer(char *p){ if(p == NULL) { p = (char *)malloc(10); } return 0;}int free_pointer(char *p){ if(p != NULL) { free(p); p = NULL; } return 0;}int m

2020-12-27 21:38:34 2460

原创 STM32编写bootloder实现跳转APP

编写bootloader便于实现串口升级操作,在bootloader启动后判断是否需要升级,如果需要升级就进入升级流程,接收上位机发送的升级包,写入APP地址空间,然后跳转到APP地址执行。若不需要升级就直接跳转到APP地址执行。首先需要两个工程,一个bootloader工程,一个app工程,对工程进行配置,给bootloader和app程序划分flash区域:/* --------------------------------------------------------------*0x080

2020-12-21 16:26:28 1869

原创 STM32使用HAL串口封装printf

在STM32开发中,会希望有串口打印,便于调试,接下来介绍两种封装方式。自己封装一个类似 printf 的函数(前提是已经可以实现串口发送了):#include <string.h>#include <stdio.h>#include <stdarg.h>uint32_t Uart_strlen ( uint8_t *str ){ uint32_t cnt = 0; cnt = 0; while(str[cnt] != 0) { cn

2020-12-20 11:12:44 880 1

原创 解决Ubuntu下wine打开微信无法看到输入框内容

Ubuntu下使用wine打开微信无法看到输入框内容的解决办法看到网上的解决办法,分为两个:方法一:将windows的c:/windows/system32/riched20.dll复制到ubuntu下的~/.wine/drive_c/windows/system32/下,然后终端执行winecfg,选择函数库标签页,然后在新增函数库顶替里添加riched20,并且编辑为原装优先于内建,然后重启微信即可。但试过这种方法并不奏效。方法二:在终端执行winetricks riched20,让其自动

2020-12-13 22:01:32 13431 11

原创 ffmpeg命令行实现h264转yuv、bmp和jpeg

ffmpeg参数介绍h264转yuvh264转btm和jpeg参数介绍Hyper fast Audio and Video encoderusage: ffmpeg [options] [[infile options] -i infile]… {[outfile options] outfile}…Getting help:-h – print basic options-h long – print more options-h full – print all options

2020-12-05 11:35:33 3071

原创 基于结构体数组的快速排序

用普通的数组快速排序,改造成任意数据的排序,比如结构体数组、链表、栈的排序等。只需要在排序中调用自己的compare函数,在其中把想要排序的值做一个比较即可,代码如下:#include <stdio.h>#include <strings.h>typedef int (*Z_COMPARE)(void* obj1, int obj1size, void* obj2, int obj2size);typedef struct{ char name[20]; char b

2020-11-01 09:01:11 2244

原创 pthread_mutex_timedlock返回22和110

1、最近用到pthread_mutex_timedlock()这个函数,给它设置了延时时间,但是经常返回22或者110。而且并没有真正的延时我所给的时间,而是直接返回,所以记录一下原因。查阅errno.h头文件可知,22错误码是代表无效参数(Invalid argument ),110错误码是代表超时(Connection timed out )。2、先来看下pthread_mutex_timedlock()函数的参数在系统头文件<pthread.h>里能看到定义:int pthread_

2020-09-26 13:39:04 1853

原创 FTK的list控件使用

1、list控件本身是支持滑动的,详情可以看ftk_list.c里的ftk_list_on_event()函数,list控件的大致使用方法是,需要两个xul,一个xul里定义list控件本身,设置属性,并且定义一个scroll_bar,这时候list是空的。再需要另外一个list_item.xul,里面就定义list_item控件,可以自定义item里面包含什么,以及item的位置。比如:第一个xul里:<dialog x="0" y="0" w="$ww" h="$wh"> <im

2020-09-26 12:13:38 174

原创 C语言判断输入过程中的ip是否合法

相信大家都见过这样一个情况:在输入框输入ip地址的过程中,如果输入错误,UI就会弹框提示你输入有误。比如当你输入1926、192… 、192.168.6.8.6等等错误的数据,都会提示你输入错误。接下来用C语言来判断输入ip的过程中是不是正确的输入,主要是判断以下几种情况是不合法的:1、同时出现两个小数点或者以小数点开头2、输入的小数点大于33、小数点之间的数字不在0~255之间//把str字符串中,第一个end字符出现的左边字符串放到out_buf中char* str_substring_lef

2020-08-14 22:46:03 1596

原创 函数指针的简单用法

正常函数指针的写法:int (*pfun)(int a,int b);定义一个函数指针pfun,可以指向一个int型的函数,参数也是两个int类型。比如:int fun1(int a,int b){ printf("a=%d,b=%d\n"); return 0;}int main(){ int (*pfun)(int a,int b); pfun = fun1; pfun(2,3); //会打印a=2,b=3 return 0;}使用typedef定义函数指针,是给函数指针

2020-08-09 11:28:15 238

原创 应用程序链接动态库出现warnning:libxxx1.so needed by libxxx2.so not found(try using -rpath or -rpath-link)

之前编译libxxx2.so的时候在makefile里链接了libxxx1.so,并且正常生成了libxxx2.so。然后编写应用的时候只调用libxxx2.so,编译make的时候就出现了warnning:libxxx1.so needed by libxxx2.so not found(try using -rpath or -rpath-link)的错误。最后解决方法是,编译应用程序链接libxxx2.so的同时也链接上libxxx1.so即可。...

2020-07-17 11:20:55 5026 2

原创 搭建和配置nfs服务器

nfs服务是什么就不用多说了,当你拥有一块linux开发板,在进行嵌入式开发的时候,或许就需要用到。简单的来说就是把自己的电脑上的文件,通过nfs服务共享到自己的开发板,电脑作为nfs服务器,而开发板作为客户端。接下来介绍如何搭建和配置nfs服务器。1、电脑安装nfs服务器sudo apt-get install nfs-kernel-server2、安装完之后,新建一个目录做为 NFS 的一个工作目录,以后我们可以把交叉编译的程序放在这个目录里,开发板可以很方便共享到这个目录里的文件。我自己创建

2020-07-10 10:07:22 518

原创 C和CPP联合交叉编译,出现arm-himix200-linux-g++:linker input file unused because linking not done 提示

最近在用海思的makefile编译一些库,在遇到C和CPP联合混编的时候出现一些问题,以此做个记录Makefile如下:SMP_SRCS := $(shell find ./ -name "*.c")SMP_SRCPPS := $(shell find ./ -name "*.cpp")OBJS := $(SMP_SRCS:%.c=%.o)CPPOBJS := $(SMP_SRCPPS:%.cpp=%.o)CFLAGS += $(COMM_INC)TARGET := libxxx.

2020-07-08 16:48:53 905 6

原创 C++三种继承方式的异同

1、类成员的三种类型public成员可以被任何类访问,protected成员限于自己和子类访问。在同一个类中使用,其访问权限相当于私有成员;但是在派生时,他的访问权限相当于公有成员private成员限于自己访问,即仅可在自己的类内使用。2、对于公有继承方式:·基类成员对派生类的可见性对派生类来说, 基类的公有成员和保护成员可见:基类的公有成员和保护成员作为派生类的成员时,它们都...

2018-12-26 16:00:57 1499

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除