
嵌入式应用程序
Alen.Wang
智能机器人硕士,擅长复杂电路设计、嵌入式软件编程及系统架构设计,从事嵌入式AI开发工作,有多年项目开发经验。
我的联系邮箱 alen_wp@163.com
展开
-
JNIOR嵌入式系统开发
最近项目开发,使用了JNIOR Series 4,现将JNIOR开发总结如下:1、常用的官方软件、文档地址:http://www.integpg.com/support/jnior/http://www.jnior.com/category/java-code-sample/http://jnior.com/download/janosruntime_1-7-1-jar/...原创 2019-10-12 20:22:15 · 541 阅读 · 0 评论 -
Linux操作系统下的多线程编程详细解析----条件变量
1.初始化条件变量pthread_cond_init#include int pthread_cond_init(pthread_cond_t *cv,const pthread_condattr_t *cattr);返回值:函数成功返回0;任何其他返回值都表示错误初始化一个条件变量。当参数cattr为空指针时,函数创建的是一个缺省的条件变量。否则条件变量的原创 2017-12-06 08:48:22 · 429 阅读 · 0 评论 -
互斥锁属性
一般用于解决在多线程中,对同一个互斥量多次上锁,造成死锁的问题。互斥锁 (Mutex) 属性 线程和线程的同步对象(互斥量,读写锁,条件变量)都具有属性。在修改属性前都需要对该结构进行初始化。使用后要把该结构回收。我们用pthread_ mutexattr_init函数对pthread_mutexattr结构进行初始化,用pthread_mutexattr_destroy函数对该结构进...原创 2017-12-05 15:22:18 · 545 阅读 · 0 评论 -
自旋锁和互斥锁的区别
自旋锁和互斥锁的区别POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套API。线程同步是并行编程中非常重要的通讯手段,其中最典型的应用就是用Pthreads提供的锁机制(lock)来对多个线程之间的共享临界区(Critical Section)进行保护(另一种常用的同步机制是barrier)。Pthreads提供了多种锁机制:Mutex(互斥量):pthread_m...转载 2017-11-25 21:21:50 · 8027 阅读 · 0 评论 -
C语言中的未初始化变量的值
C语言中未初始化的变量的值是0么全局变量 、静态变量初始值为0局部变量,自动变量初始值随机分配C语言中,定义局部变量时如果未初始化,则值是随机的,为什么?定义局部变量,其实就是在栈中通过移动栈指针来给程序提供一个内存空间和这个局部变量名绑定。因为这段内存空间在栈上,而栈内存是反复使用的(脏的,上次用完没清零的),所以说使用栈来实现的局部变量定义时如果不显式初始化,值就是脏的。转载 2017-11-25 11:56:54 · 15716 阅读 · 2 评论 -
二级指针如何分配动态内存并赋值
//二级指针如何分配动态内存并赋值#include #include int main(void){ int **p = NULL; //最好是显式初始化这个二级指针 以防不测 int m, n, i, j; printf("请输入数组的行数和列数:\n例如格式:5,6 :代表5行6列\n"); scanf("%d,%d", &m, &n); p原创 2017-10-21 16:44:34 · 3335 阅读 · 0 评论 -
在液晶屏里显示浮点数的方法 (sprintf 的妙用)
思路:使用 sprintf 函数将浮点型数据转为指定格式的字符串#include #includeint main(){ unsigned char len,temp[10]; float a =1234.5689; len=sprintf((char *)temp,"%0.2f",a); printf("%d [%s]\n",len,temp); retu原创 2017-11-20 14:26:36 · 14038 阅读 · 4 评论 -
if语句的陷阱
#includevoid main(){ char a=0; if(a==0) { a=1; printf("00000000\n"); } else if(a==1) { a=0; printf("11111111\n"); }}输出结果是:0000原创 2017-06-29 14:06:32 · 747 阅读 · 0 评论 -
C语言itoa()函数和atoi()函数详解(整数转字符C实现)
C语言提供了几个标准库函数,可以将任意类型(整型、长整型、浮点型等)的数字转换为字符串。1.int/float to string/array:C语言提供了几个标准库函数,可以将任意类型(整型、长整型、浮点型等)的数字转换为字符串,下面列举了各函数的方法及其说明。● itoa():将整型值转换为字符串。● ltoa():将长整型值转换为字符串。● ultoa()转载 2017-04-13 20:56:15 · 14668 阅读 · 1 评论 -
linux getline()函数
getline()函数是什么?百度百科这样解释: getline不是C库函数,而是C++库函数。它会生成一个包含一串从输入流读入的字符的字符串,直到以下情况发生会导致生成的此字符串结束。1)到文件结束,2)遇到函数的定界符,3)输入达到最大限度。linux标准C中使用条件:#define _GNU_SOURCE#include 函数声明:ssize_t ge原创 2017-06-16 20:47:14 · 4473 阅读 · 0 评论 -
linux c下,从路径名中分离文件名
首先介绍一些查找字符的函数1、strrchr头文件:#include strrchr() 函数用于查找某字符在字符串中最后一次出现的位置,其原型为: char * strrchr(const char *str, int c);【参数】str 为要查找的字符串,c 为要查找的字符。strrchr() 将会找出 str 字符串中最后一次出现的字符原创 2017-12-15 11:06:44 · 4977 阅读 · 0 评论 -
Linux下用文件IO的方式操作GPIO(/sys/class/gpio)
英文不错的,可以看看:https://blog.youkuaiyun.com/ruanjianruanjianruan/article/details/47734397先看:嵌入式linux下操作GPIO在嵌入式设备中对GPIO的操作是最基本的操作。一般的做法是写一个单独驱动程序,网上大多数的例子都是这样的。其实Linux下面有一个通用的GPIO操作接口,那就是我要介绍的 “/sys/class/...转载 2019-03-12 08:37:56 · 9701 阅读 · 0 评论 -
NTP协议
网络时间协议,英文名称:Network Time Protocol(NTP) linux C/C++实现同步NTP时间 简单的NTP客户端-C语言实现 NTP协议简介 关于下面的C++代码,我是基于博客园席纳霍霍的代码进行修改的。他的代码在我的系统里运行时间不对。非常感谢上面3位作者无私奉献。C++ 代码:#include <stdio.h&g...原创 2019-02-23 15:47:24 · 633 阅读 · 0 评论 -
sizeof用法总结
由于不同位数的操作系统计算结果可能不同,下面是在32位的win7 下计算的。 1 对于直接的调用sizeof,如果是数组首地址,sizeof会输出数组所占地址空间的大小(字节为单位)。如果是一个指针的话,则输出在该系统中地址的字节宽度,即(位宽/8)。#include <stdio.h>int main(){ char a[25]; char *b;...原创 2018-09-21 08:46:31 · 1283 阅读 · 0 评论 -
malloc、vmalloc、kmalloc的区别
1、kmalloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存 2、kmalloc保证分配的内存在物理上是连续的,内存只有在要被DMA访问的时候才需要物理上连续,malloc和vmalloc保证的是在虚拟地址空间上的连续3、kmalloc能分配的大小有限(可分配的内存大小范围在32~131027(128k)字节),vmalloc和malloc能分配的大小相对较大4、vmal...原创 2018-06-15 12:04:04 · 933 阅读 · 0 评论 -
GCC内嵌汇编之语法详解
开发Arm程序的时候,大多数时候使用C/C++语言就可以了,但汇编语言在某些情况下能够实现一些C语言无法实现的功能,这时候就要调用一些汇编语言的程序.我们需要大概了解一下在C语言中如何嵌入汇编语言.内嵌汇编语法如下: __asm__(汇编语句模板: 输出部分: 输入部分: 破坏描述部分) 共四个部分:汇编语句模板,输出部分,输入部分,破坏描述部分,各部分使用“:”格开,汇编语句模板必...转载 2018-03-13 20:38:55 · 15495 阅读 · 2 评论 -
tinyhttpd编译出错的解决方法
book@ubuntu:/home/demo/tinyhttpd-0.1.0$ makegcc -W -Wall -lsocket -lpthread -o httpd httpd.chttpd.c: In function ‘startup’:httpd.c:437:34: warning: pointer targets in passing argument 3 of ‘gets原创 2018-01-27 14:41:28 · 2495 阅读 · 0 评论 -
linux获取文件大小的函数fstat()
C语言fstat()函数:由文件描述词取得文件状态头文件:#include #include 定义函数:int fstat(int fildes, struct stat *buf);函数说明:fstat()用来将参数fildes 所指的文件状态, 复制到参数buf 所指的结构中(struct stat). fstat()与stat()作用完全相同,原创 2017-03-03 09:11:27 · 15728 阅读 · 0 评论 -
C语言实现Base64编码/解码
Bse64是一种以64个可打印字符对二进制数据进行编码的编码算法。base64在对数据进行编码时以三个8位字符型数据为一组,取这三个字符型数据的ASCII码,然后以6位为一组组成4个新的数据,这4个新的数据有6位,所以它的最大值为2^6=64。我们以4个6位数据的十进制数从base64表中得到最终编码后的字符。Base64 编码表Value Char Value ...原创 2017-12-18 19:10:36 · 52415 阅读 · 23 评论 -
strcpy()与strncpy()的区别
头文件:#include <string.h>strcpy() 函数用来复制字符串,其原型为:char *strcpy(char *dest, const char *src);【参数】dest 为目标字符串指针,src 为源字符串指针。注意:src 和 dest 所指的内存区域不能重叠,且dest 必须有足够的空间放置 src 所包含的字符串(包含结束符NULL)。【返回值】成功执行...原创 2017-06-16 17:37:13 · 31556 阅读 · 2 评论 -
linux串口基本编程
Linux的串口表现为设备文件。 Linux 的串口设备文件命名一般为/dev/ttySn(n=0、1、2„„),若串口是USB扩展的,则串口设备文件命名多为/dev/ttyUSBn(n=0、1、2„„)。当然这种命名规则不是绝对的,不同的硬件平台对串口设备文件的命名可能有所区别。注意:我使用的是虚拟串口;通过 dmesg | grep原创 2017-05-17 17:04:49 · 484 阅读 · 0 评论 -
getenv、setenv函数(获取和设置系统环境变量) 与 环境变量
1、getenv()函数名: getenv功 能: 从环境中取字符串,获取环境变量的值头文件: stdlib.h用 法:char *getenv(char *envvar);函数说明:getenv()用来取得参数envvar环境变量的内容。参数envvar为环境变量的名称,如果该变量存在则会返回指向该内容的指针。环境变量的格式为envvar=value。原创 2017-05-25 19:57:51 · 19147 阅读 · 0 评论 -
undefined reference to `pthread_create' collect2: ld returned 1 exit status
问题原因: pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a,所以在使用pthread_create()创建线程,以及调用 pthread_atfork()函数建立fork处理程序时,需要链接该库。问题解决: 在编译中要加 -lpthread参数 gcc mult-thread-tcp-server原创 2016-12-29 22:00:11 · 2145 阅读 · 0 评论 -
网络编程 recv()函数
recv()是编程语言函数。函数原型int recv( _In_ SOCKET s, _Out_ char *buf, _In_ int len, _In_ int flags);这里只描述同步Socket的recv函数的执行流程。当应用程序调用recv函数时:(1)recv先等待套接字s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络原创 2016-12-29 21:26:39 · 1428 阅读 · 0 评论 -
获得内核函数地址的四种方法
本文以获取内核函数 sys_open()的地址为例。 1)从System.map文件中直接得到地址: $ grep sys_open /usr/src/linux/System.map 2)使用 nm 命令: $ nm vmlinuz | grep sys_open 3)从 /proc/kallsyms 文件获得地址:转载 2017-01-05 20:27:24 · 2191 阅读 · 0 评论 -
函数指针和指针函数的区别
一、【函数指针】 在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。 1、函数指针定义 顾名思义,函数指针说的就是一个指针,但这个指针指向的函数,不是普通的基本数据类型或者类对象。函数类型(*指针变量名)(形参列表原创 2017-01-03 16:04:41 · 588 阅读 · 0 评论 -
Ubuntu下使用gcc编译c文件,未识别cos,sin
Ubuntu下使用gcc编译c文件,虽然我调用了math.h的头文件,但是未识别cos,sin 报错:( fft.c )/tmp/ccwXjD8C.o: In function `fft':fft.c:(.text+0x17a): undefined reference to `cos'fft.c:(.text+0x188): undefined reference to `s原创 2016-12-06 21:15:12 · 2533 阅读 · 1 评论 -
linux下printf函数为什么不加\n就不能输出相关的内容 ?
原因: 输出缓冲区的问题.unix上标准输入输出都是带有缓存的,一般是行缓存。对于标准输出,需要输出的数据并不是直接输出到终端上,而是首先缓存到某个地方,当遇到行刷新标志或者该缓存已满的情况下,才会把缓存的数据显示到终端设备上。ANSI C中定义换行符'\n'可以认为是行刷新标志。所以,printf函数没有带'\n'是不会自动刷新输出流,直至缓存被填满。解决方案:方案原创 2016-11-21 09:11:40 · 10608 阅读 · 0 评论 -
字符串指针与字符数组的区别
字符串指针与字符数组的区别 1,数组直接储存对象,指针则是指向一个对象。2,数组名不能被赋值,指针变量能。3,sizeof一个数组,得到数组的长度(字节单位),sizeof一个指针,相当于sizeof(void*)。(注意,不同目标平台指针长度可能不同,所以sizeof(void*)是最准确的回答)4,指针是间接访问,数组是直接访问。 4.1. 在ANSI C中,原创 2016-12-10 18:11:26 · 554 阅读 · 0 评论 -
ASCII字符点阵字库的制作和使用
转自:http://blog.youkuaiyun.com/exbob/article/details/6532772开发环境:Win7,Eclipse,MinGW 1、生成ASCII字符文件ASCII编码的可打印字符是0x20~0x7E,先用运行下面这段代码,生成一个包含全部可打印字符的txt文件:[cpp] view plain copy转载 2017-01-11 20:45:24 · 12838 阅读 · 1 评论 -
用C语言实现中文到unicode码的转换
转自: http://blog.youkuaiyun.com/qq_21792169/article/details/50379275源文件用不同的编码方式编写,会导致执行结果不一样由于本人喜欢用Notepad++编辑器,该编辑器的好处是小巧灵活,但是有几个地方做的不足,但是我都能够很好的采取相应的措施来替代,下面让我们看看Notepad++有哪些地方的不足,进而采取怎样的措施。转载 2017-02-13 11:10:18 · 7664 阅读 · 0 评论 -
select函数详解
Select函数在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect、 accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回)。可是使用Select就可以完成非阻塞(所谓非阻原创 2017-02-23 20:24:26 · 982 阅读 · 1 评论 -
指针空间的申请与释放
隐蔽的内存泄漏内存泄漏主要有以下几种情况:内存分配未成功,却使用了它。内存分配虽然成功,但是尚未初始化就引用它。内存分配成功并且已经初始化,但操作越过了内存的边界。忘记了释放内存,造成内存泄露。释放了内存却继续使用它。对动态内存的错误观念有人对某一只在函数内使用的指针动态分配了内存,用完后不释放。其理由是:函数运行结束后,函数内的所有变量全部消亡。这是错误的原创 2017-03-11 11:26:31 · 2615 阅读 · 0 评论 -
error: converting to execution character set: Invalid or incomplete multibyte or wide character
交叉编译.c文件,遇到如下问题arm-linux-gcc -o show_lines show_lines.c -lfreetype -lmshow_lines.c:199:19: error: converting to execution character set: Invalid or incomplete multibyte or wide character大概意思是,原创 2017-03-06 20:34:42 · 12732 阅读 · 0 评论 -
宽字节
例子: wchar_t *chinese_str = L"韦gif"; unsigned int *p = (wchar_t *)chinese_str; int i; printf("Uniocde: \n"); printf("韦gif :共 %d 个宽字节wchar_t\n",wcslen(chinese_str)); for (i = 0; i < wcslen(原创 2017-03-04 19:01:20 · 778 阅读 · 0 评论 -
C语言 mmap()函数(建立内存映射) 与 munmap()函数(解除内存映射)
头文件:#include #include 定义函数:void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offsize);函数说明:mmap()用来将某个文件内容映射到内存中,对该内存区域的存取即是直接对该文件内容的读写。参数说明:参数说原创 2017-02-14 17:18:29 · 7893 阅读 · 0 评论 -
Linux编程里getopt_long_only函数用法详解
在程序中难免需要使用命令行选项,可以选择自己解析命令行选项,但是有现成的,何必再造轮子。下面介绍使用getopt_long_only和getopt_long(两者用法差不多)解析命令行选项。程序中主要使用:短选项长选项是否需要参数-n--username是(用户名)指定用户名原创 2017-02-12 11:32:20 · 2495 阅读 · 0 评论 -
strdup与strndup
strdup()函数是c语言中常用的一种字符串拷贝库函数,一般和free()函数成对出现。extern char *strdup(char *s);头文件:string.h功 能: 将串拷贝到新建的位置处strdup()在内部调用了malloc()为变量分配内存,不需要使用返回的字符串时,需要用free()释放相应的内存空间,否则会造成内存泄漏。原创 2017-02-12 11:20:48 · 1488 阅读 · 0 评论 -
C语言strchr()函数:查找某字符在字符串中首次出现的位置
头文件:#include strchr() 用来查找某字符在字符串中首次出现的位置,其原型为: char * strchr (const char *str, int c);【参数】str 为要查找的字符串,c 为要查找的字符。strchr() 将会找出 str 字符串中第一次出现的字符 c 的地址,然后将该地址返回。注意:字符串 str 的结束标志 NU转载 2017-02-12 10:45:22 · 25042 阅读 · 0 评论