C
文章平均质量分 77
Acuity.
只要思想不滑坡,想法总比问题多。
展开
-
关于8位指针强制转16位隐晦问题
&emsp;最近关于一个void fun(uint8_t *buf, uint8_t size){ uint8_t i; uint16_t data; for (i=0; i<4; i+=2) { data = *((uint16_t *)&buf[i]); /* todo */ } }原创 2019-09-26 00:18:02 · 4271 阅读 · 2 评论 -
【Linux网络编程】socket编程“网络字节顺序”和“主机字节顺序”
1.大小端模式 在socket编程前,有必要知道大小端模式。大小端模式是指计算机内存中数据存放的模式,由CPU决定,与操作系统无关。大端模式(Big-endian,是指数据的高字节保存在内存的低地址中,数据的低字节保存在内存的高地址中,这种存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;与我们的阅读习惯一致。小端模式(Little-endian),是指数据...原创 2019-01-13 00:25:33 · 3867 阅读 · 0 评论 -
【Linux驱动编程】嵌入式Linux下 24系列EEPROM/FRAM驱动
1.写在前面 “24系列”的EEPROM,一般地我们认为是以i2c为通信接口的一系列串行EEPROM,各大半导体厂商出产的该系列EEPROM都遵循这个规则,而且电路和控制程序上也兼容。如AT24C02、ST24C02等。 EEPROM在嵌入式开发中使用广泛,在此之前,有总结过MCU下24系列EEPROM的驱动接口——“24系列EEPROM/FRAM通用接口”。根据该文章中的接口,作调整,使...原创 2019-05-31 23:51:32 · 2040 阅读 · 0 评论 -
localtime函数在不同平台使用注意
1.写在前面 localtime函数是C语言标准库中时间库“time.h”中获取系统带时区时间的函数,获得的时间最终以“strcut tm”的格式输出。对于通用操作系统如Windows、Linux中调用该函数,那么获得的时间就是带时区的,这一点毫无疑问。而在一些嵌入式场合,我们也需用到将时间戳转换成“年月日时分秒”格式,如不额外自行编写换算函数,可以直接调用该函数。在以往开发非联网或者国内使用...原创 2018-12-17 23:56:28 · 6910 阅读 · 2 评论 -
FreeRTOS初体验
1.写在前面 实时系统(RTOS)种类五花八门,除了老牌RTOS如UCOS、vxWorks、FreeRTOS,及国内的RT-Thread、阿里AliOS、华为LiteOS等;也涌现出新兴的RTOS。对于RTOS的选择也是比较纠结,特别是学习阶段。但一般情况下,如果进入公司,公司都会选择比较成熟稳定的RTOS,或者基于历史原因的还依然使用老牌RTOS。鄙人本着“支持国产”原则,一直使用的是RT-...原创 2018-10-16 00:34:42 · 5165 阅读 · 2 评论 -
【组件】24系列EEPROM/FRAM通用接口
1.写在前面 “24系列”的EEPROM,一般地我们认为是以i2c为通信接口的一系列串行EEPROM,各大半导体厂商出产的该系列EEPROM都遵循这个规则,而且电路和控制程序上也兼容。如AT24C02、ST24C02等。 FRAM(铁电存储器)是近几年来比较热门的一项存储技术,并且有相关实际产品的应用。FRAM具有ROM和RAM的特点,擦写寿命长、读写速度快、低功耗(读写所需电压低...原创 2018-09-18 22:00:27 · 6180 阅读 · 1 评论 -
一个变量越界引起的灾难
1.前言 一般地,对于内存块访问(如数组、程序员动态分配的内存块、系统从堆上分配的内存块),通过“下标”形式访问时,如果稍有不留意,对于末尾地址的访问处理不当,则会发生程序异常,轻则导致当然应用程序(进程)异常退出,重则导致整个系统瘫痪。如果是在嵌入式系统里发生,如裸机程序,或者多线程的实时系统(RTOS)中,基本会导致整个系统程序异常退出(死机)。这对于用户来说是“灾难”性事的、不可接受的...原创 2018-09-12 00:40:04 · 2033 阅读 · 0 评论 -
MISRA C编程规范标准
MISRA (The Motor Industry Software Reliability Association),中文名称为汽车工业软件可靠性联会,是英国的一个跨国汽车工业协会,其成员包括了大部分欧美汽车生产商。其核心使命是为汽车工业提供服务和协助,帮助厂方开发安全的、高可靠性的嵌入式软件。MISRA C则是由MISRA提出的针对嵌入式C语言开发标准,目的是提高嵌入式系统的安全性、可读性...原创 2018-08-23 23:14:45 · 28496 阅读 · 2 评论 -
NXP SPIFI(QSPI)应用详解与程序固件分散加载
1. SPIFI 标准 SPIFI(SPI FLASH INTERFACE),百度百科的定义:SPIFI是SPI闪存接口专利技术的缩写,可以帮助32位嵌入式微片器使用小尺寸、低成本的串行闪存替代大尺寸、高成本的并行闪存。利用SPIFI技术,外部串行闪存可以映射到微控制器内存中,达到片上内存读取效果。关于SPIFI的资料并不多,因为SPIFI是NXP(恩智浦)公司提出来并应用在自身各系列的MC...原创 2018-08-15 00:48:54 · 13900 阅读 · 9 评论 -
【组件】onewire(单总线)抽象
1.前言 onewire(单总线)是DALLAS公司推出的外围串行扩展总线技术总线,顾名思义,它是采用一根信号线进行通信,即传输时钟信号又传输数据,而且能够进行双向通信,具有节省I/O口线、资源结构简单、成本低廉、便于总线扩展和维护等诸多优点。常用到单总线的器件,一般是稳定传感器、EEPROM、唯一序列号芯片等,如DS18B20、DS2431。 在使用单总线时,往往很少CPU会提供硬件...原创 2018-07-22 15:04:11 · 13519 阅读 · 6 评论 -
字符IP地址和整型数转换
IP(Internet Protocol),IP地址中文名称为互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。 常用的IP地址有IPV4和IPV6,IPV4地址是一个32位的二进制数,通常...原创 2018-07-11 00:11:35 · 5655 阅读 · 0 评论 -
STM32F4模拟i2c
STM32F4系列出来已有好几年,价格上也越来越亲人,在需求性能的场合上可以考虑使用。对于STM32F1的硬件i2c的诟病也是很多使用者吐槽,对于F4的硬件i2c,本人没有做详细测试,也不好判断,据一些使用者反馈有改善。在之前“i2c模型/模拟i2c”文章中有使用到模拟i2c,现在将其移植到F4系列的MCU上。F1中用的是标准库,F4中用的是HAL库,函数API有差别,但使用思维是一样的。 ...原创 2018-06-27 00:13:30 · 5774 阅读 · 5 评论 -
标准硬件spi访问非标spi外设
1.写在前面 最近有收到坛友发帖提问或者私信,关于硬件spi总线访问非标spi器件问题,根据以往使用经验归纳总结。 spi(Serial Peripheral Interface)串行外设接口,嵌入式开发中最常用的接口之一,MCU、MPU都会提供硬件spi总线,甚至低端MCU都集成。对于无硬件spi总线,或者spi总线不够用时,也可以根据spi标准时序,使用普通GPIO模式spi总线。 ...原创 2019-01-25 00:09:20 · 1546 阅读 · 0 评论 -
LPC4088片内EEPROM使用方法
1.写在前面 LPC4088是NXP出的Cortex M4内核MCU,带硬件浮点运算,主频高达120MHz。其中一个优势是片内集成4KB EEPROM,省去外挂EERPOM的成本。2.使用片内EEPROM NXP亦提供了类似ST的硬件库,但没有ST做得人性化,但我们也可以直接使用其硬件库,省去配置寄存器的琐碎。使用片内EEPROM,与之相关的是“lpc_eeprom.c”原文件。2....原创 2019-02-25 00:08:44 · 1134 阅读 · 1 评论 -
【Linux 网络编程】TCP epoll聊天程序
实现目标【1】创建TCP服务器和客户端,实现简易聊天程序;【2】单一进程,通过I/O复用epoll函数实现;【3】客户端/服务器任一结束,结束连接和对方进程。epoll类函数 epoll与select/poll是有本质上区别的,是为了处理大批量文件描述符而作了改进的poll,相比select/poll能够显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。epoll特...原创 2019-08-27 00:16:42 · 1350 阅读 · 0 评论 -
【Linux网络编程】TCP select聊天程序
实现目标【1】创建TCP服务器和客户端,实现简易聊天程序;【2】单一进程,通过I/O复用select函数实现;【3】客户端/服务器任一结束,结束连接和对方进程。select函数 Linux系统中I/O复用实现方式有selece()、poll()、epoll()。I/O复用可以使单一进程可以同时监听多个文件描述符(句柄)事件的发生,而不用建立多个进程,在特殊情况下可以节约系统资源,但牺...原创 2019-08-23 00:10:51 · 658 阅读 · 0 评论 -
【Linux 网络编程】TCP多进程聊天程序
实现目标【1】创建TCP服务器和客户端,实现简易聊天程序;【2】数据收发单独进程实现;【3】客户端/服务器任一结束,结束连接和对方进程。服务器端(server)#include <stdio.h>#include <stdlib.h>#include <string.h>#include <netinet/in.h>#include...原创 2019-08-21 23:41:35 · 593 阅读 · 0 评论 -
【Linux 网络编程】TCP poll聊天程序
实现目标【1】创建TCP服务器和客户端,实现简易聊天程序;【2】单一进程,通过I/O复用poll函数实现;【3】客户端/服务器任一结束,结束连接和对方进程。poll函数 poll函数和select函数调用的本质一样的,也是对所有监听文件描述符进行轮询,有事件发生则返回。与select不同的是,poll监听文件描述符数目没有限制,poll执行完不会清空文件描述符集合,也就是不需每次都...原创 2019-08-24 17:42:46 · 677 阅读 · 0 评论 -
【Linux应用编程】一文弄懂Linux守护进程
守护进程 守护进程(daemon)是一类在后台运行的特殊进程,守护进程特点是,不受任何终端控制、不受用户登录注销影响。通常在系统启动的时候启动,仅在系统运行结束后才终止。 可以通过“ps ajx”命令查看系统的守护进程,其中TPGID为-1的就是守护进程。守护进程作用 守护进程在后台中周期性地执行某种特殊任务;或者等待某些发生地事件而唤醒该进程进程处理世界,处理完则进入休眠。【1...原创 2019-08-06 00:08:07 · 404 阅读 · 0 评论 -
while(i--)陷阱
1.案例 在访问一段存储空间时使用到“while(i–)”模型代码,抽出主体代码。/** * @brief 获取数据 * @param buf:数据返回地址 size:获取数据长度 * @retval 实际获取的数据长度*/uint32_t read_buf(uint8_t *buf,uint32_t size){ uint32_t temp = 0; u...原创 2019-07-10 22:49:52 · 2873 阅读 · 2 评论 -
base64原理与实现
1.base64 bse64是一种以64个可见字符集对二进制数据进行编码的编码算法。1.1应用范围 base64常用于网络数据传输过程的编解码环节。HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了base64来将一个较长的一个标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的...原创 2019-07-13 23:59:37 · 5481 阅读 · 6 评论 -
持续更新,值得推荐的c/c++开源框架与库
框架Apache C++ Standard Library : 是一系列算法,容器,迭代器和其他基本组件的集合ASL : Adobe源代码库提供了同行的评审和可移植的C++源代码库。Boost : 大量通用C++库的集合。BDE : 来自于彭博资讯实验室的开发环境。Cinder : 提供专业品质创造性编码的开源开发社区。Bxxomfort : 轻量级的,只包含头文件的库,将C++ 11...转载 2019-07-03 22:08:07 · 1220 阅读 · 0 评论 -
自定义格式化输出函数
1.写在前面原创 2019-05-12 16:15:57 · 1715 阅读 · 0 评论 -
C语言数组居然有[-1]下标?
1.背景 最近在查阅代码(C)时出现类似“a[-1]”的操作,以过往的经验,觉得是非法的访问数组操作,第一反应就是不存在这样的语句,连编译都通不过。实质上,这是完全没问题的语句,编译和执行都是不存在问题,当然也可能与编译器相关。void fun(char *a){ a++; printf("%c\n",a[-1]);}2.a[-1]涵义2.1 案例分析 “[]”一般用...原创 2019-04-20 00:17:48 · 10209 阅读 · 0 评论 -
各大半导体原厂芯片代码仓库(GitHub)
从事嵌入式开发,经常与底层芯片打交道,在使用一个新的芯片时,一般原厂都会提供相关驱动(driver)或者演示例程(demo),也方便我们快速使用该芯片,提高产品开发效率。一般地,原厂提供的代码包括几部分,Android/Linux系统板级支持包,这部分可以直接移植过去使用;Android/Linux驱动,可以移植过去或者参考修改;Android/Linux演示例程,提供用户参考;单片机(MCU...原创 2019-03-31 20:25:04 · 3245 阅读 · 0 评论 -
BCD码与十进制数间转换
1.BCD码 BCD码(Binary-Coded Decimal)称为二进码十进数或二——十进制代码。用4位二进制数来表示1位十进制数中的0~9这10个数码。BCD码可分为有权码和无权码两类:有权BCD码有8421码、2421码、5421码,其中8421码是最常用的;无权BCD码有余3码,余3循环码等。 1.1 8421码 8421 BCD码是最基本和最常用的BCD码,它和四位...原创 2018-06-13 00:26:15 · 79397 阅读 · 9 评论 -
C/C++编程常引用到的头文件
1.POSIX标准定义的头文件 POSIX表示可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX ),POSIX标准定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称,其正式称呼为IEEE 1003,而国际标准名称为ISO/IEC 9945。 ...原创 2018-06-05 20:20:12 · 1993 阅读 · 0 评论 -
C/C++笔试(二)(C库(4)——strcpy实现)
最近面试,笔试试题遇到关于strcpy函数的实现问题,整体实现思路不难,但涉及到一些细节问题,而面试官的主体意思应该也就是考察面试者对于细节处理问题。面试完毕,后面查阅网络上相关答案,发现自己还是考虑不周全,出现细节错误。 题目: 已知strcpy函数的原型是: char * strcpy(char * strDest,const char * strSr...原创 2018-06-04 00:29:00 · 739 阅读 · 0 评论 -
【组件】i2c抽象/模拟i2c
1.写在前面i2c总线是由PHILIPS公司开发的一种简单、双向二线制同步串行总线。关于i2c的使用,并不陌生,C51、ARM、MSP430等,都基本集成硬件i2c,或者不集成i2c的,可以根据总线时序图使用普通IO口翻转模拟一根i2c总线。对于当下流行的stm32饱受诟病的硬件i2c,相信很多人都是使用模拟i2c。模拟i2c的源码比较多,大多都是大同小异,对于各类例程,提供的模拟i2c似乎都...原创 2017-12-23 09:27:26 · 14295 阅读 · 2 评论 -
【组件】spi抽象/硬件spi
1.写在前面spi(Serial Peripheral Interface)即串行外设接口。与i2c一样,spi也常用外设设备通信的总线,从事嵌入式开发必不可少的掌握。根据本人以往的经历,对spi进行总结(主要是MCU范畴,Linux已有成熟的驱动设备),主要目的及实现:a)spi总线与spi设备分离;b)快速使用新的硬件spi或者模拟spi;c)方便移植spi总线设备及spi外设...原创 2018-01-07 23:09:16 · 13263 阅读 · 6 评论 -
基姆拉尔森算法获取星期
1.写在前面在此之前,一直用库函数获取星期,或者直接从硬件RTC中读取星期。今天,恰巧需用到,根据年、月、日换算出星期。然后才发现有如此好用的算法——基姆拉尔森计算公式(Kim larsson calculation formula)。2.基姆拉尔森算法C语言实现C语言、平台Linux、编译器g++用gcc编译出错,为什么? #include "stdio.h"v...原创 2018-01-06 23:59:18 · 628 阅读 · 0 评论 -
ADC(二)—MCP3202
1.器件介绍mcp3202是Microchip(微芯科技)公司产的一款ADC芯片,成本低,使用方便。本文主要分析软件使用方面的特点及方法。1.1器件特点1)转换精度:12bit2)转换速率:100ksps(最快)3)伪差分输入4)4线spi控制接口5)使用简单,无须复杂的寄存器配置,直接通过spi获取转换数据1.2应用范围1)传感器2)过程控制3)数据采...原创 2018-01-23 10:31:44 · 6385 阅读 · 0 评论 -
ADC(一)—AD7683/AD7684/ADS8317
1.写在前面项目需要用到模拟信号转换(ADC),由于精度、速度及准确度都要求比较高,故选择外设独立ADC芯片。外置独立ADC价格上都比较贵,首先考虑的是ADI的器件,经过综合价格、性能、采购渠道等,最终选择AD7683/AD7684。AD7683和AD7684的区别是前者是伪差分输入,后者是真差分输入,其他性能基本一致,程序兼容。ADS8317是德州仪器(TI)产的,与AD7684兼容,都是真...原创 2018-01-12 14:46:58 · 8210 阅读 · 20 评论 -
【组件】模拟spi抽象
1.前言接上一篇“spi抽象/硬件spi”博客。上一篇文章主要描述spi总线抽象过程和使用方式,同时实现stm32f1硬件spi,及spi抽象接口函数的使用。对于一些特殊mcu没有硬件spi,或者硬件spi不够用的情况下,可以用io翻转方式模拟spi总线。模拟spi实现,只需将硬件spi部分替代即可,上层代码或者器件外设驱动程序无须更改,方便移植。模拟spi与之前一篇“i2c抽象/...原创 2018-01-14 22:55:20 · 3009 阅读 · 10 评论 -
新版Visual Studio编译旧版本程序提示使用scanf_s
1.问题描述更新Visual Studio后,编译旧版本程序失败,提示使用“scanf_s”函数。2.解决办法1)直接将“scanf”函数修改为“scanf_s”函数,并增加缓存大小限定参数,可正确编译运行。2)在源文件开始处增加“#pragma warning(disable:4996)”预处理命令,强制调用原版本函数。3)关闭VS安全检查。具体步骤如下:a)项目-&...原创 2018-01-05 15:48:43 · 2890 阅读 · 0 评论 -
EEPROM(AT24C16)页写算法
1.写在前面 学习单片机或者从事嵌入式开发的,对于EEPROM绝不会陌生,尤其的24系列的EEPROM很是经典,或者与此兼容的FRAM系列,如AT24C02、AT24C16、FM24C16等。 驱动起这个系列的EEPROM,可以说是没有任何难点,各类教程、源码、驱动都可以轻松找到并作稍微改动即可使用。但是,对于使用技巧方面,大多的教程并不会提及,而只是作为学习“入门”的一个途径...原创 2017-11-16 13:58:11 · 15125 阅读 · 20 评论 -
ARM Linux判断SD卡是否加载成功
1、写在前面ARM-Linux在访问SD卡数据时,严格的步骤,第一步应该是检查SD卡是否被系统成功加载。当然,缺少这一步也不影响,从后面应用层访问操作的返回值也可知道操作状态,但如果在第一部就有检查时,出现问题可以立刻发现。2、判断SD卡加载状态1)通过“sdcard”文件夹Linux下如果加载SD卡成功,在根目录下会生成一个“sdcard”文件夹,SD卡的内容,及用户访问数据,都通过这个文件夹。...原创 2018-01-03 16:49:47 · 8565 阅读 · 1 评论 -
常用排序算法
数据排序开发中经常使用到的,而数据排除则需应用到排序算法,常用的排序算法不外乎就几类,不同的排序算法,其性能效率和应用范围都不同。对于一般小数量的排序,任选一排序算法即可。常用的排序算法有:冒泡排序、选择排序、插入排序、快速排序、堆排序、归并排序、希尔排序、基数排序排序 平均时间复杂度 最坏时间复杂度 最好时间复杂度 空间复杂度 稳定性 ...原创 2017-12-27 23:29:48 · 576 阅读 · 0 评论 -
【组件】通用环形缓冲区模块
写在前面环形缓冲区是嵌入式应用(医疗电子、消费电子、工控)中常用的数据结构模型,如音视频流、通信总线数据收发等。一些操作系统、第三方库都提供现成的环形缓冲区接口API,性能和安全性都有保障,多线程访问互斥机制,空内存访问保护等。1.基本原则先进先出(FIFO),重复使用。2.实现原理环形缓冲区,顾名思义就是一段循环使用的一段内存。通过写指针向“空白内存”(未写入过或者已经被读出...原创 2017-12-26 15:23:53 · 6812 阅读 · 17 评论 -
Linux系统编程——IO编程
1.Linux文件操作 “一切皆文件”是Linux系统的基本思想。Linux 提供的虚拟文件系统为多种文件系统和外设驱动提供了统一的接口,基于此类接口,可以实现文件的新建、打开(open)、读(read)、写(write)、关闭(close),及对随机文件的定位(lseek)。 通常,一个进程打开现有文件或新建文件时,系统会返回一个文件描述符fd(file descriptor),指示...原创 2018-01-30 11:41:49 · 2970 阅读 · 0 评论