自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 资源 (4)
  • 收藏
  • 关注

原创 LineageOS 17.1 for Redmi K30 5G (picasso) 下载和编译

参考XDA论坛:https://forum.xda-developers.com/t/rom-unofficial-alpha-lineageos-17-1-for-redmi-k30-5g-picasso-20200419.4063507/(需要翻墙)下载参考:https://www.htcp.net/5016.html和https://mirrors.tuna.tsinghua.edu.cn/help/lineageOS/编译时候报错解决:1、报内存问题:参考(1)、(2)和(3)(1.

2021-03-03 13:20:56 1999

原创 大话数据结构——线性表的顺序存储结构

代码示例如下:#include "stdio.h"#include "stdlib.h"#include "sys/io.h"#include "math.h"#include "time.h"#define OK 1#define ERROR -1#define TRUE 1#define FALSE 0#define MAXSIZE 20typedef int Status;typedef int ElemType;Status visit(ElemType c...

2020-08-06 13:30:16 162

原创 linux进程间通信——使用消息队列(摘抄自ljianhui)

使用消息队列来进行进程间通信,消息队列与命名管道有很多相似之处。一、什么是消息队列消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制。linux用宏MSGMAX和MSGMNB来限制一条消息的最大长度和一个队列的最大长度。二、在linux中使用消息队列linux提供了一系列消息队列的函数接口

2020-07-28 11:06:37 151

原创 linux进程间通信——命名管道

这里介绍进程的另一种通信方式——命名管道,来解决不相关进程间的通信问题。一、什么是命名管道命名管道也被称作FIFO文件,它是一种特殊类型的文件,它在文件系统中以文件名的形式存在,但是它的行为却和之前所讲的没有名字的管道(匿名管道)类似。由于linux中所有的事物都可被视为文件,所以对命名管道的使用也就变得与文件操作非常的统一,也使它的使用非常方便,同时我们也可以像平常的文件名一样在命令中使用。二、创建命名管道我们可以使用下面两函数之一来创建一个命名管道,它们的原型如下:#includ

2020-07-27 17:18:17 220

原创 linux进程间通信——使用数据报套接字(摘抄自ljianhui)

一、简单回顾——什么是数据报套接字。socket,即套接字是一种通信机制,凭借这种机制,客户端/服务器端(即要进行通信的进程)系统的开发工作既可以在本地机器是进行,也可以跨网络(机器)进行。也就是说它可以让不在同一台计算器但通过网络连接计算机上的进程进行通信。也因为这样,套接字明确将客户端和服务器区分开来。相对于流套接字,数据报套接字的使用更为简单,它由类型SOCK_DGRAM指定的,它不需要建立连接和维持一个连接,它们在AF_INET中通常是通过UDP/IP协议实现的。它对可以发送的数据长度有限制

2020-07-27 14:17:41 198

原创 linux进程间通信——使用流套接字(摘抄自ljianhui)

socket进行通信的进程可以是同一台机器的进程,也可以是通过网络连接起来的不同机器上的进程。通常我们使用socket进行网络编程,这里将会简单讲述如何使用socket进行简单的网络编程。一、什么是socketsocket,即套接字是一种通信机制,凭借这种机制,客户/服务端(即要进行通信的进程)系统的开发工作既可以在本地单机上进行,也可以跨网络进行。也就是说它可以让不同的连接好网络的机器之间的进程进行通信。也因为这样,套接字明确将客户端和服务器区分开来。二、套接字的属性套接字的特性由三个属性

2020-07-24 17:21:44 151

原创 linux进程间通信——使用匿名管道(摘抄自ljianhui)

一、什么是管道linux shell命令中,我们通常通过符号“|”来使用管道,但是管道的真正定义是什么呢?管道是一个进程连接数据流到另一个进程的通道,它通常是用作把一个进程的输出通过管道连接到另一个进程的输入。举个例子,在shell中输入命令:ls -l | grep string,我们知道ls命令(其实也是一个进程)会把当前目录中的文件都列出来,但是它不会直接输出,而是把本来要输出到屏幕上的数据通过管道输出到grep这个进程中,作为grep这个进程的输入,然后这个进程对输入的信息进行筛选,把存在s

2020-07-24 10:59:53 144

原创 linux进程间通信——信号集函数

通过信号可以终止进程,也可以通过信号在进程间通信,程序也可以通过制定信号的关联处理函数来改变信号的默认处理方式,也可以屏蔽某些信号,使其不能传递给进程。那么我们应该如何设定我们需要处理的信号,我们不需要处理的信号等问题呢?信号集函数就是帮助我们解决这些问题的。下面是信号函数集:1、int sigemptyset(sigset* set);该函数的作用是将信号集初始化为空。2、int sigfillset(sigset* set);该函数是把信号集初始化包含所有已定义的信号。3、int

2020-07-23 09:00:09 111

原创 linux启动新进程的几种方法及比较(摘抄自ljianhui)

有时候,我们需要在自己的程序(进程)中启动另一个程序(进程)来帮助我们完成一些工作,那么我们需要怎么才能在自己的进程中启动其他的进程呢?在linux中提供了不少的方法来实现这一点,下面来介绍一下这些方法以及它们之间的区别。一、system函数调用system函数的原型为:#include <stdlib.h>int system(const char* string);它的作用是,运行以字符串参数的形式传递给它的命令并等待该命令的完成。命令执行情况就如同在shell中执行命令

2020-07-22 17:29:58 210

原创 linux数据管理——文件锁定(摘抄自ljianhui)

一、什么是文件锁定对于锁这个字,大家一定不陌生,因为我们生活中就存在大量的锁,它们各个方面发挥着它的作用,现在世界中锁的功能都可归结为一句话,就是阻止某些人做某事,例如,门锁就是阻止除了屋主之外的人进入这个房子,你进入不到这个房子,也就不能使用屋子里面的东西。因为程序经常需要共享数据,这通常通过文件来实现的,试想一个情况,A进程正在对一个文件进行写操作,而另一个程序B需要对同一个文件进行读操作,并以读取到数据作为自己程序运行时所需要的数据,这会发生什么情况呢?进程B可能会读到错乱的数据,因为它并不知

2020-07-22 15:47:45 307

原创 linux进程间通信——使用共享内存(摘抄自ljianhui)

一、什么是共享内存顾名思义,共享内存是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间,所有进程都可以访问共享内存的地址 ,就好像它们是由用c语言函数malloc分配的内存一样。而如果某个进程向内存写入数据,所做的改动立即影响到可以访问同一段共享内存的任何其他进程。特别提醒:共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作

2020-07-21 16:29:19 141

原创 linux进程间通信——信号量(摘抄自ljianhui)

一、什么是信号量为防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域。临界区域是指执行数据更新的代码需要独占式地执行。而信号量就可以提供这样的一种访问机制,让一个临界区域同一时间只有一个线程在访问它,也就是说信号量是用来协调进程对共享资源的访问的。信号量是一个特殊的变量,程序对其访问都是原子操作,且只允许对它进行等待(即P(信号变量))和发送(即V(信号变量))信息操作。最简单的信号量是只能取0和

2020-07-21 09:44:33 102

原创 孤儿进程和守护进程摘抄

1、什么是孤儿进程1)、如果一个子进程的父进程先于子进程结束,子进程就成为一个孤儿进程,它由init进程收养,成为init进程的子进程。2)、那么如何让一个进程成为一个孤儿进程呢?我们可以先创建一个进程,然后杀死其父进程,则其他就变成了孤儿进程。pid = fork();if(pid > 0){ eixt(0);}#include <stdio.h>#include <unistd.h>#include <sys/types.h&g..

2020-07-18 16:21:53 124

原创 linux同步互斥,自旋锁、互斥锁区别

一句话理解同步与互斥:我等你用完厕所,我再用厕所。什么叫同步?就是条件不允许,我要等等。什么是互斥?你我早起都要用厕所,谁先抢到谁先用,中途不被打扰。同步与互斥经常放在一起讲,是因为它们之间的关系很大,“互斥”操作可以用“同步”来实现。我“等”你用完厕所,我再用厕所。这不就是用“同步”来实现“互斥”吗?伪代码如下:void 抢厕所(void){ if(有人在用) { 我眯一会; } 用厕所; 喂,醒醒,有人用厕所吗;}假设A、B两人早...

2020-07-17 21:28:31 877

原创 在加锁和解锁时候,初学者常犯的两个错误——摘抄自李先静博客

1、存在遗漏解锁的路径。初学者常见的做法就是,进入某个临界函数时加锁,在函数结尾的地方解锁,有时候,return的地方太多,在某一处忘记解锁是可能的,就像内存泄露一样,只是忘记解锁的后果更严重。就像下面的例子:DListRet dlist_insert(DList* thiz,size_t index,void* data){ DListNode* node = NULL; DListNode* curnode = NULL; return_val_if_fail(thiz !...

2020-07-08 13:47:40 607

原创 linux下多线程编程的基本方法,初学者常犯错误。摘抄自李先静博客。

1、用临时变量作为线程参数的问题。#include <stdio.h>#include <pthread.h>#include <assert.h>void* start_routine(void* param){ char* str = (char*)param; printf("%s:%s\r\n",__func__,str); return NULL;}pthread_t create_test_thread(){...

2020-07-07 11:09:48 150

转载 debug信息打印,不用assert,只打印一个警告的宏定义

我们需要定义两个宏,一个用于无返回值的函数:#define return_if_fail(p) if(!(p)) \{printf("%s:%d Warning: "#p" failed.\n", \__func__, __LINE__); return;}一个用于有返回值的函数:#define return_val_if_fail(p, ret) if(!(p)) \{printf("%s:%d Warning: "#p" failed.\n",\__func__, __LINE_.

2020-07-06 17:22:41 160

原创 回调函数编写双向链表求和、找最大值学习笔记(摘抄自李先静博客)

1、自己之前在开发功能时候也常常封装很多函数。这种做法会造成重复的代码,让dlist的实现随着应用环境的变化而变化。2、采样上一篇的回调函数法。这两个函数的实现和dlist_print的实现类似,无非是print那行代码要换成别的功能。在真正动手时,发现每个回调函数都要保存一些中间数据。大部分人选择了用全局变量来保存,这可以实现要求的功能(这也是我常常犯的毛病),但违背了禁用全局变量的原则。(1).不要编写重复的代码。写重复的代码很简单,甚至凭本能都可以写出来。但要想成为优秀的程序员,一定要克服

2020-07-01 21:02:58 256

原创 回调函数法编写通用的接口

以打印双向链表方法dlist_print函数为例typedef struct _DListNode{ struct _DListNode* prev; struct _DListNode* next; void* data;}DListNode;struct _DList{ DListNode* first;};typedefstruct _DListDList;定义函数指针类型:typedef void (*DListDataPrin...

2020-06-29 21:36:52 184

原创 jni使用c语言调用android shell命令方法

int sys(const char * cmdstring){  pid_t pid;  int status;  if(cmdstring == NULL){            return (1);  }  if((pid = fork())        status = -1;  }  else if(pid

2016-09-23 11:19:47 8291

原创 全志A20 wifi驱动移植

最近调试了rt5572模块的wifi驱动,sta功能是好的,ap和wifi direct功能没有调试出来,调试流程和教训总结如下:1、这两款都是usb接口的,首先确保电源是好的,android系统启动后,busybox lsusb罗列一下pid和vid。2、加载编译好的驱动insmod *.ko,busybox ifconfig -a查看相关设备有没转出来wlan0 p2p0,busybo

2015-08-29 15:16:22 3935

原创 驱动开发中常用功能测试之proc_create的使用方法

proc_create的使用方法proc文件系统是个有用的东东。创建一个proc虚拟文件,应用层通过读写该文件,即可实现与内核的交互。proc虚拟文件是如何创建的呢?先看看比较简单的,创建proc文件夹。调用以下函数,即可实现proc文件夹的创建:struct proc_dir_entry *proc_mkdir(const char *name, struct p

2015-05-28 17:05:08 1635

原创 A20平台物理按键适配总结

android源码对应如下:external/kernel-headers/original/linux/input.hdevice/softwinner/wing-clover/configs/sw-keyboard.klframeworks/base/include/androidfw/KeycodeLabels.hframeworks/base/services/inpu

2015-05-27 18:03:59 2271

原创 android系统中间件移植-3G4G通信模块适配

一、在内核源码drivers/usb/serial/option.c文件中添加相关模块的pid和vid,有些模块还需要厂家提供的系统上的驱动。下面列举我们公司常用的模块以及pid和vid:{ USB_DEVICE(0x16d5, 0x6502) }, //DTM518{ USB_DEVICE(0x19D2, 0xFFED) }, //MC2716{ USB_DEVICE(0x1AB

2015-01-23 09:49:50 7775 1

转载 OpenCV内存泄露的检测

OpenCV内存泄露的检测上文介绍了C/C++编码中内存泄露的问题,不过经过本人测试,好像对用opencv工具包进行编码中的内存泄露并不起作用。CrtSetDbgFlag函数应该针对new/malloc这种方式分配内存的,而opencv的很多函数把内存分配封装了,直接返回一个指针(e.g. cvCreateImage返回IplImage指针),因而并不能检测出opencv编码的内存泄露.(

2014-01-25 14:28:18 3425 3

原创 c语言编程规范

文件开头处的版权和版本的声明/* * Copyright (c) 2013,宁波普天通信技术有限公司 * All rights reserved. *  *  文件名称:filename.h *  文件标识:见配置管理计划书 *  摘     要:简要描述本文件的内容 *  *  当前版本:1.1 *  作     者:输入作者(或修改者)名字 *  完

2013-06-06 17:22:11 744

原创 pthread多线程编程+锁

#include #include #include #include #define MAX 11pthread_t thread[2];pthread_mutex_t mut;int number=0, i;void *thread1(){        printf ("thread1 : I'm thread 1\n");        for

2013-05-22 10:41:19 721

原创 mmap操作arm寄存器

#include  #include  #include  #include #include #include #define GPIO_CTL_BASE 0x56000000 #define rGPBCON 0x10 #define rGPBDAT 0x14 #define rGPBUP 0x18#define rGPGCON 0x60#de

2013-02-25 18:18:13 1514

原创 c语言中break和continue的用法

使用c语言也有一段时间了,但是再阅读别人的代码的时候,关于break和continue的意思总是模棱两可。看都这样,谈何写!?借这个机会,在这里把break和continue的用法做个明朗点的总结,以资以后使用。一、1.break语句通常用在循环语句和开关语句中。当break语句用于开关语句switch中时,可使程序跳出switch而执行switch以后的语句;如果没有break语句,则将

2013-01-26 21:00:50 64959 5

原创 LTE项目stm32单片机硬件测试(原来网络dhcp动态ip方式配置成静态ip方式)

一、在使用ubuntu12.04的过程中发现:未插网线的情况下启动很慢解决方法:看看进程里面有没有dhcp相关进程或者bind进程;在console上输入:ps -aux 看到dhcp相关进程dhclient3(不是手动添加,一开机运行的) 一、/etc/network/interface文件我们这里网卡的名字是eth0注释掉动态获取ip #auto eth0#

2013-01-23 21:41:11 4104

原创 stm32f103窗口看门狗

stm32有两个看门狗:独立看门狗可以在检测到硬件故障的时候复位cpu,窗口看门狗可以在检测到软件故障的时候复位cpu。我在程序中使用的是窗口看门狗,它有俩窗口值:上窗口值可以通过配置WWDG->CFR寄存器的底七位,下窗口值是固定的0x40。WWDG_CR的底七位是看门狗的count计数值。当count在窗口值之外更新或者计数值记到小于0x40的时候,窗口看门狗复位cpu。这里需要注意的

2012-12-25 22:52:16 5309

原创 stm32f103 usb虚拟成pc端的串口

stm32f103的usb的dp引脚上拉为高电平(由低变高)的时候,通过安装相应驱动可以把其usb口虚拟成串口。我们这里需要虚拟两个串口:一个串口是交互数据的,一个串口数字语音的。mdk官方例程中对usb的初始化相关代码已经给出了。我们要做的就是根据项目需求对通过usb接收到的数据存到缓存中并对其进行处理,还有写好发送数据的函数向pc端发送数据。下面就大概的代码做一下说明:#defin

2012-12-20 11:11:39 15137

原创 IIC总线协议

三轴陀螺仪的芯片MPU-6050芯片驱动是采用IIC总线协议和处理器进行通信。学习一下IIC总线的协议并总结在此:处理器和芯片间的通信可以形象的比喻成两个人讲话:1、你说的别人得能听懂:双方约定信号的协议。2、你的语速别人得能接受:双方满足时序要求。看IIC协议先:两条线可以挂多个设备。IIC设备(稍微有点智能的)里有个固化的地址。只有在两条线上传输的值等于我(IIC设备)的地址时,我才作

2012-11-28 13:04:22 104206 16

原创 STM32F10x命名规则

STM32 F 103 C 6 T 7 xxx   1    2   3   4   5 6 7   8  第1部分:产品系列名,固定为STM32  第2部分:产品类型;F表示这是Flash产品,目前没有其它选项  第3部分:产品子系列;103表示增强型产品,101表示基本型产品105表示集成一个全速USB 2.0 Host/Device/OTG接口和两个具有先进过滤功能的

2012-11-26 13:24:37 1970 1

原创 talnet服务器搭建

刚安装的ubuntu12.04还没有telnet功能,需要配置一下我主要是想让ubuntu12.04开启telnet服务做服务器安装openbsd-inetd:#sudo apt-get install openbsd-inetd安装telnetd:#sudo apt-get install telnetd在etc/inetd.conf文件中可以看到这一

2012-11-03 12:37:43 1617

原创 ftp服务器搭建

1、sudo apt-get install vsftpd2、在配置ftp服务器之前应该先ping一下,看能不能ping通。服务器和客户端ip地址应该设置在同一个网段。3、vsftpd配置文件vsftpd.conf内容大致如下:listen=YESlocal_enable=YESwrite_enable=YESdirmessage_enable=YESuse

2012-10-22 16:23:05 660

原创 window xp系统安装(大白菜)

作为一个IT从业人员,哥却一直以来没怎么装过系统,看好多人大学时候就能用装系统泡妞,而我现在连女朋友都木有,看来要好好利用好it男的优势,多用点心学习和总结。好吧,从重装系统开始,哈哈 一、GHOST版本的安装    1、文件准备。    将ghost安装版的光盘镜像ISO复制到U盘。最好提取ISO中的gho文件(如果有多个gho文件,应该选最大的那一个)到U盘。    2、安

2012-10-21 16:19:17 2674

原创 内核kernel panic错误定位

本文是基于linux2.6.28.6版本内核,使用led驱动和内核定时器驱动模拟灯闪(并且在内核定时器驱动中断函数中使用空指针模拟kernel panic错误)。以报错信息为根据,通过对驱动程序进行反编译与获得的系统中函数对应地址进行对比。从而定位kernel panic是哪里引起的。一、下面为报错的信息:/usr/local/nbpt/ltx # ./leds_test[ 4000.

2012-10-18 19:42:12 7193

原创 android代码的ndk编译

一、下载android-ndk-r8b-linux-x86.tar.bz2并解压缩二、输入下面三条命令配置环境变量,也可以写成脚本的形式.shexport NDK=/home/zlsextra/fs/ndk_r8/android-ndk-r8bexport SYSROOT=$NDK/platforms/android-8/arch-armexport CC="$NDK/toolchai...

2012-09-11 19:27:56 913

原创 linux下3.4.1交叉编译器编译busybox-1.20.2

一、移植:busybox-1.20.0并且使用strace解决问题1、到官网下载:http://www.busybox.net/downloads/2、解压:tarxvf busybox-1.20.0.tar.bz23、配置:cd busybox-1.20.0                make menuconfig4、配置选项添加交叉编译工具:arm-linux-Bu

2012-08-27 23:23:33 7472

linux下GPS数据存储和解析

linux下GPS数据存储到buff里和解析日期和经纬度等

2013-01-25

单片机嵌入式16*16点阵

嵌入式单片机16*16点阵Proteus电路图和源程序实例仿真广告字循环显示

2010-04-18

1602字符液晶Proteus仿真

1602字符液晶的Proteus仿真实例源程序加电路图

2010-04-18

嵌入式LCD驱动图形界面Ucgui汉字开发FPGA和ARM中的程序开发软件

Ucgui汉字开发嵌入式LCD驱动图形界面Ucgui汉字开发FPGA和ARM中的程序开发软件

2010-03-20

空空如也

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

TA关注的人

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