C语言
文章平均质量分 50
Andy001847
我步入丛林,是为了活得深刻。
展开
-
Unix C (十)
网络编程: ip 地址 是网络中计算机的地址,和mac地址(网卡出厂地址/物理地址)联合 能够让网络找到计算机。用端口(port)定位一个进程。因此网络编程就是 ip+端口。 Unix系统中,几乎一切都可以看成文件。因此网络信息的交互就用文件的交互方式。 ip地址底层是整数,分为ipv4(4位ip)和ipv6(6位)。 对ip的描述方式一般使用点分十进制。4个或者6个 0-原创 2014-12-23 18:03:49 · 771 阅读 · 0 评论 -
C语言字符串的处理
字符串的处理: 1、C程序员定义字符串的方式有三种: 1) 字符串字面值:”abc” 2) 字符数组:char buf[50]; 3) 字符指针:char *str;2、数组可以看成常指针(不可以改变地址,只能初始化)。某些时候和指针有区别(比如使用sizeof的时候)。 3、memset函数可以清理字符数组,包括变长数组。4、实例:/*原创 2017-02-17 09:34:23 · 875 阅读 · 0 评论 -
延时函数sleep和delay的区别
在VC中使用带上头文件#include <windows.h>注意: 在VC中Sleep中的第一个英文字符为大写的”S” 在标准C中是sleep, 不要大写.. 下面使用大写的来说明,, 具体用什么看你用什么编译器. 简单的说VC用Sleep, 别的一律使用sleep. Sleep函数的一般形式: Sleep(unisgned long); 其中,Sleep()里面的单转载 2017-02-16 09:32:17 · 14589 阅读 · 0 评论 -
什么是达夫设备(Duff's Device)
在看《你必须知道的496个C语言问题》一书中,提到”达夫设备”这个东西,主要是下面的代码:register n = (count + 7) / 8; /* count > 0 assumed */switch (count % 8){ case 0: do { *to = *from++; case 7:转载 2017-03-10 09:24:26 · 825 阅读 · 0 评论 -
STM32平台下的TM1812驱动
TM1812芯片的特性如下: 数据传输参数及时序: 在上图中一个串联了三个TM1812芯片,每个芯片控制四盏灯,每盏灯有R,G,B三种颜色,每种颜色有256(0xFF)阶灰度可调,及每个颜色用一个字节控制。发送完全部LED灯的数据后,发送RESET信号进行LED显示以及重新接收数据。下面是我在STM32F030C8T6中的驱动,时钟频率48MHz。 tm1812.h的代码:#i原创 2017-09-14 09:27:24 · 6690 阅读 · 8 评论 -
Keil用fromelf工具生成bin文件
fromelf –bin –output “@P.bin” “#L” @P,就是取工程名 Project407,不要后缀. $L@P.bin在指定路径下生成bin文件. @P:在工程的根目录下生成文件. 工程名和链接文件名是不一样的. 工程名:建立工程时候取得名字. 链接文件名:自己随时可更改的.如下图.转载 2017-09-07 10:25:06 · 7746 阅读 · 0 评论 -
Makefile简易教程
Makefile简介在软件开发中,make通常被视为一种软件构建工具。该工具主要经由读取一种名为“makefile”或“Makefile”的文件来实现软件的自动化建构。它会通过一种被称之为“target”概念来检查相关文件之间的依赖关系,这种依赖关系的检查系统非常简单,主要通过对比文件的修改时间来实现。在大多数情况下,我们主要用它来编译源代码,生成结果代码,然后把结果代码连接起来生成可执行文件或者库转载 2017-09-01 15:56:56 · 423 阅读 · 0 评论 -
Log打印技巧(C语言实现)
在实际开发中我们经常要通过打印Log来调试程序,经常会用到打印函数,这里我书写了个宏,做到有选择的打印log。发话不多说,直接贴代码,希望对各位同人有所启发。/*File : log.cBreif : Define a macro to optition print logDate : 2016-12-16Author: Andy*/#include <stdio.h>/* Defin原创 2016-12-16 14:29:16 · 6069 阅读 · 5 评论 -
STM32之SPI驱动外部Flash
MCU为STM32F030C8T6,Nor Flash为IS25LQ010B。spi.h源代码#ifndef __spi_H#define __spi_H#ifdef __cplusplusextern "C" {#endif/* Includes ------------------------------------------------------------------*/#inc原创 2017-09-22 12:02:00 · 2240 阅读 · 0 评论 -
防止头文件被重复包含的两种方式#pragma once 与 #ifdef 的区别
当一个项目比较大时,往往都是分文件,这时候有可能不小心把同一个头文件 包含多次,或者头文件嵌套包含,比如: a.h 中包含 b.h : #include “b.h” b.h 中包含 a.h: #include “a.h” 而main.c 中使用其中头文件: #include “a.h” int main() { return 0;} 编译上面的例子,会出现如下错误:转载 2016-11-20 13:51:33 · 2489 阅读 · 0 评论 -
STM32之串口重定向printf函数和scanf函数
在进行STM32开发时,需要将日志打印出来,直接使用C语言的库函数printf是不起作用的,此时就需要我们将串口重定向printf函数。首先我们需要在keil集成开发环境中勾选STM32官方的微库,如下图所示: 然后就是重写fputc函数,使之定向到制定的串口中去。代码如下:#ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (opti原创 2017-09-09 11:48:50 · 7903 阅读 · 0 评论 -
STM8L15x系列DAC的使用
在项目中偶尔会使用DA转换器,我使用的MCU是STM8L151G6U6。我是用的是PB4作为DA输出管脚,查阅该芯片的Reference manual手册可知,PB4是属于DAC_OUT1,即DAC通道一。 再查阅PB4输入输出控制,PB4对应的是开关15。 下面是我用软件触发模式使用的DAC配置代码。 dac.h头文件代码如下:#ifndef __DAC_H__#define __原创 2017-11-29 10:30:54 · 4200 阅读 · 0 评论 -
USART配置成SPI实例代码
在工作中第一次遇到可以将串口当做SPI使用的情况,下面是我在ATSAM4SD16B芯片中书写的将USART配置成SPI使用的代码。// Include files#include "component_usart.h"#include "sam4sd16b.h"#include "assert.h"#include "sam_gpio.h"#include "sysclk.h"#defin原创 2017-02-08 15:49:06 · 1964 阅读 · 1 评论 -
void在C语言中特殊使用
在C语言中,在定义函数时,加在函数名前的“void”表示该函数没有返回值,调用时直接书写函数名和参数即可。 但是有些函数明明在定义的时候不是void型,却在调用时可能会在前面加上void,这表示程序并不关心调用该函数后的返回值是什么,即告诉静态代码检测工具不要去处理此处该函数的返回值。比如函数strcpy,我们直接用“strcpy(des_str, src_str);”这样的形式来用。“(voi转载 2016-11-17 13:53:55 · 2580 阅读 · 0 评论 -
普通GPIO模拟SPI通信协议(软件SPI)
在工作中偶尔会遇到SPI不够用的情况,而我们又要去使用SPI通信协议,此时就需要我们自己去模拟SPI通信协议。我们知道SPI通信协议有四种模式,它们分别如下所示: 下面是我基于ATSAM4SD16B芯片在Atmel Studio上用普通GPIO模拟的SPI通信协议的代码:#include "ioport.h"#include "pio.h"#include "delay.h"#inclu原创 2016-12-29 09:46:02 · 26231 阅读 · 3 评论 -
Unix C (四)
文件: 1、在Linux系统中,几乎一切都是文件。目录(使用vi目录名验证),内存(查看/proc/进程号/maps文件验证),硬盘(查看/dev文件可验证)以及其他的各种硬件设备都可以看成文件。比如:文件/dev/tty可以看成键盘和显示器。 2、在标准C中的文件操作:用FILE*代表fopen打开的一个文件;而在UC中用文件描述符(一个非负整数)代表打开一个文件。原创 2014-12-22 16:32:51 · 681 阅读 · 0 评论 -
Unix C (六)
文件锁: 1、当多个进程同时写一个文件时,有可能出现数据混乱,这个问题需要解决。解决方案:进程间的同步或文件锁。 2、文件锁就是当一个进程读写文件时,对其他进程进行读写的限制。 3、文件锁的结论:1)一个进程读,允许其他进程读,但不允许其他进程写。 2)一个进程写,其他进程既不能读也不能写。 4、文件锁是一个读写锁,包括读锁和写锁原创 2014-12-23 15:16:09 · 550 阅读 · 0 评论 -
Unix C (七)
进程: 1、程序和进程的区别。1)程序就是代码编译链接的成品(可执行程序)。程序是硬盘上的文件。2)进程就是运行在内存中的程序,一个程序可以启动多次,得到多个进程。3)CPU只能直接操作内存,不能直接操作硬盘,硬盘上的程序想要运行,程序必须先加载到内存中,变成进程。4)在日常生活中,为了跟客户交互,有时候也把进程成为程序。2、主流的操作系统都是多进程的,每个进程内部还可原创 2014-12-23 15:42:16 · 552 阅读 · 0 评论 -
Unix C (八)
信号(signal):1、信号是Unix/Linux系统中软件中断的最常用方式。2、中断就是中止当前正在执行的代码,转而执行其他代码。中断分为软件中断和硬件中断。常见信号中断:Ctrl+c段错误总线错误整数除0kill -9发送信号9子进程结束给父进程发信号信号的本质就是一个非负正数,Unix和Linux在信号上有区别。Unix是48个,Linux是64个,原创 2014-12-23 17:06:48 · 724 阅读 · 0 评论 -
Unix C (二)
库:便于团队开发程序,便于维护。 1、二进制形式目标模块的包。 a.o \ b.o -> abc.a---库 c.o / 2、库的分类:静态库和共享库(动态库)。 静态库:扩展名.a。库中所封装的二进制代码,在链接阶段被复制到调用模块中。 共原创 2014-12-22 01:10:50 · 882 阅读 · 0 评论 -
Unix C (九)
进程间通信————IPC(Inter Process Communication)1、Unix/Linux系统基于多进程,进程和进程之间经常做数据的交互,这种技术称为进程间通信。2、进程间通信的方式:1)文件2)信号3)管道(最古老的IPC之一,目前较少使用)4)共享内存5)消息队列6)信号量集7)网络编程(socket)...其中共享内存、消息队列和信原创 2020-09-22 17:37:35 · 632 阅读 · 0 评论 -
什么是达夫设备(Duff's Device)
在看《你必须知道的496个C语言问题》一书中,提到"达夫设备"这个东西,主要是下面的代码:register n = (count + 7) / 8; /\* count > 0 assumed \*/switch (count % 8){case 0: do { \*to = \*from++;case 7: \*to = \*from++;case转载 2014-12-27 11:36:16 · 843 阅读 · 0 评论 -
Unix C (十一)
线程 1、理论和原理 1)主流的操作系统都是支持多进程的,每个进程的内部可以启动多线程完成代码的并行;每个线程的内部可以无限启动多线程。 2)线程是轻量级的,不拥有自己独立的内存空间,共享所在进程的相关资源(代码区/全局区/堆/文件状态/共享资源),线程拥有的只是一个独立的栈空间。 3)进程是重量级的,必须拥有自己独立的内存空间。 4)计算机执行代码必备CPU/内存,原创 2014-12-29 22:13:28 · 643 阅读 · 0 评论 -
双向链表实现的消息队列
// include head file#include <stdio.h>#include <stdint.h>#include <stdlib.h>#include <string.h>#include <vld.h> /* This head file could be omit, it used for check whether memory leak. You must be原创 2016-04-26 18:26:32 · 1181 阅读 · 0 评论 -
数据结构——双向链表(C语言实现)
/*************************************************************************> File Name: link_list.c> Author: Andy001847> Mail: yunzhonglai@hotmail.com> Created Time: 2014年10月25日 星期六 11时51分34秒******原创 2016-04-26 19:00:39 · 923 阅读 · 0 评论 -
STM32F030C8T6串口接收不定长数据
usart.c文件代码。#include "usart.h"#include "gpio.h"UART_HandleTypeDef huart1;/* USART1 init function */void MX_USART1_UART_Init(void){ huart1.Instance = USART1; huart1.Init.BaudRate = 115原创 2018-01-24 14:35:20 · 4054 阅读 · 1 评论