C
Leo丶Fun
这个作者很懒,什么都没留下…
展开
-
大型工程代码如何防止头文件被重复包含
如以下代码://vs 2012 : test.c#include #include "test.h"extern i;extern void test1();extern void test2();int main(){ test1(); printf("ok/n"); test2(); printf("%转载 2017-12-21 16:00:54 · 445 阅读 · 0 评论 -
UART和RS232/RS485的关系是什么
串口通讯是电子工程师和嵌入式开发工程师面对的最基本问题,RS232则是其中最简单最常用的通讯方式。但是初学者往往搞不清有关的名词如UART和RS232或RS485之间是什么关系,因为它们经常被放到语句中同等的位置使用。在百度搜索二者的区别,可以看到排在最前面的答案充斥着混淆的概念。就此,谈谈我对这几个概念的理解,希望能帮初学者厘清它们之间的关系。~~ 通讯问题,和交通是一样的。串口通...转载 2018-02-26 14:31:47 · 1500 阅读 · 0 评论 -
C语言零长数组data[0]
1、前言 今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内核中,结构体中经常用到data[0]。这样设计的目的是让数组长度是可变的,根据需要进行分配。方便操作,节省空间。2、data[0]结构经常遇到的结构形状如下:struct bu转载 2018-02-07 09:05:36 · 262 阅读 · 0 评论 -
17年C语言笔记
1. char buf[32] = {0}; prinf("please input a string:\n"); scanf("%s", buf) //千万不要在%s后面加换行2.递归:函数内部调用自身,结束条件:当函数不再调用自身的就跳出递归3.操作系统有两种 用MMU的 和 不用MMU的用MMU的是Windows MacOS Linux Androi不用MMU的是FreeRT...原创 2018-04-11 21:26:42 · 266 阅读 · 0 评论 -
17年数据结构笔记
1.程序 = 数据结构 + 算法2.T(n) = 2n^3 + 3n^2 + 2n + 1 = O(n^3)3.LIFO:后进先出4.FIFO:先进先出5.栈有顺序存储和链式存储结构,但一般我们使用栈是顺序存储6.将单链表倒置1void reverseLink(LINK *head)2{3 if(NULL == head)4 {5 printf("the link is ...原创 2018-04-11 21:27:52 · 148 阅读 · 0 评论 -
数据段、代码段、BSS段、堆栈段
进程(执行的程序)会占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等。不过进程对这些内存的管理方式因内存用 途 不一而不尽相同,有些内存是事先静态分配和统一回收的,而有些却是按需要动态分配和回收的。对任何一个普通进程来讲,它都会涉及到5种不同的数据段。Linux进程的五个段下面我们来简单归纳一下进程对应的内存空间中所包含的5种不同的数据区都是干什么的。BSS...原创 2018-05-15 13:44:11 · 19898 阅读 · 6 评论 -
程序的内存布局——函数调用栈的那点事
[注]此文是《程序员的自我修养》的读书总结,其中掺杂着一些个人的理解,若有不对,欢迎拍砖。程序的内存布局现代的应用程序都运行在一个虚拟内存空间里,在32位的系统里,这个内存空间拥有4GB的寻址能力。现代的应用程序可以直接使用32位的地址进行寻址,整个内存是一个统一的地址空间,用户可以使用一个32位的指针访问任意内存位置。【关于虚拟地址空间的介绍,看这里http://blog.csdn.net/ya...转载 2018-05-16 09:33:04 · 3174 阅读 · 0 评论 -
#pragma的详细用法
转载自:https://www.cnblogs.com/azraelly/archive/2012/07/05/2577334.html每种C和C++的实现支持对其宿主机或操作系统唯一的功能。例如,一些程序需要精确控制超出数据所在的储存空间,或着控制特定函数接受参数的方式。#pragma指示使每个编译程序在保留C和C++语言的整体兼容性时提供不同机器和操作系统特定的功能。编译指示被定义为机...转载 2018-08-28 10:05:04 · 2984 阅读 · 1 评论 -
嵌入式中断服务函数的一些特点
中断是嵌入式系统中重要的组成部分,但是在标准C中不包含中断。许多编译开发商在标准C上增加了对中断的支持,提供新的关键字用于标示中断服务程序 (ISR),类似于__interrupt、#program interrupt等。当一个函数被定义为ISR的时候,编译器会自动为该函数增加中断服务程序所需要的中断现场入栈和出栈代码。 中断服务程序需要满足如下要求: (1)不能返回值转载 2018-02-05 17:55:21 · 1309 阅读 · 0 评论 -
移植mysql到arm平台
首先更新虚拟机下载源sudo apt-get update在安装mysql时./configure容易出现错误error: No curses/termcap library found原因是缺少ncurses安装包解决方法:sudo apt-cache search ncursessudo apt-get install libncurses5-dev如果要将转载 2018-01-29 15:38:19 · 820 阅读 · 0 评论 -
Ubuntu下编译ARM平台Qt的MySQL插件
最近需要将一个程序移植到arm平台上,程序调用了MySQL数据库,所以就牵扯到将MySQL数据库移植到ARM平台上面,所以在网上大量查阅资料。在baidu文库发现了一篇文档,是wlzxlc上传的文档名称为:《编译ARM平台的QtEmbedded的MySQL插件和移植MySQL》。下面说明里面介绍到:ARM平台下的QtEmbedded所需mysql插件,及MySQL的移植。我的整个移植过程参转载 2018-01-29 15:28:21 · 195 阅读 · 0 评论 -
为什么使用goto语句作错误处理
2月22日,苹果更新了iOS7.0.6,修复了一个bug,之后引起轩然大波,这个低级的bug会导致严重的安全问题. 这个bug很简单,就是在代码中多写了一条goto fail语句,我们且不讨论这个bug如何(有兴趣的同学可以查阅文章末尾的链接),我们来讨论另一个问题. 稍微有一些linux驱动编程经验的同学都知道,一般都会使用goto语句作错误处理,上大一的时候教C语言的老转载 2018-01-10 14:44:38 · 10304 阅读 · 0 评论 -
__builtin_expect — 分支预测优化
1.引言在很多源码如Linux内核、Glib等,我们都能看到likely()和unlikely()这两个宏,通常这两个宏定义是下面这样的形式。#define likely(x) __builtin_expect(!!(x), 1)#define unlikely(x) __builtin_expect(!!(x), 0)可以看出这2个宏都是使用函数 __builtin_exp...转载 2018-01-11 13:54:58 · 411 阅读 · 0 评论 -
移植MySQL到嵌入式ARM平台
MySQL没有专门针对ARM的版本,移植到ARM没有官方文档可参考,因此,暂时参考这样一篇文档: http://blog.chinaunix.net/space.php?uid=9701860&do=blog&id=285428,因为MySQL5.5之后,编译是用的cmake不再使用./configure,因此,只好倒回支持./configure的版本来用,这里使用了文档上的5.1.51版转载 2018-01-30 11:27:02 · 1120 阅读 · 1 评论 -
为结构体中函数指针赋值的两种方法
/** 02. * 为结构体中的指针数组赋值 03. */ 04. 05.#include 06. 07.typedef struct test 08.{ 09. void (*p)(void); 10. void (*q)(void); 11. void (*y)(void); 12.}test; 13. 14.void f1(转载 2018-01-31 10:53:37 · 3742 阅读 · 1 评论 -
linux下的动态库与静态库
今天就来谈一下linux中比较重要的一个知识点–静态库和动态库。说到静态库和动态库啊,不得不提的就是程序编译链接的过程,现在有很多的IDE我们很少去关注程序编译链接的本质,但是其背后的运行机制却是必须要我我们熟悉的,我之前写过一片就是C、C++程序的编译链接过程的博客,详情见下:http://blog.csdn.net/payshent/article/details/723146转载 2018-02-01 17:11:11 · 169 阅读 · 0 评论 -
C语言静态库与动态库的区别的深入分析
区别1:在目标文件链接成可执行文件阶段,库函数(库函数本身有一个代码段)链接进可执行文件(代码段)中,占了很大的内存空间。而使用动态库时,只是在链接时做了一个printf的标记,当可执行程序运行时才会加载这段printf(从库路径中加载动态链接库.so文件),这样就节省了可执行程序的空间,只有在运行这段很短的时间会占用可执行程序的空间。可以做个测试,写一个输出hello world的小转载 2018-02-03 14:28:36 · 2135 阅读 · 0 评论 -
C语言学习笔记--动态库和静态库的使用
1.C语言中的链接器 (1)每个C 语言源文件被编译后生成目标文件,这些目标文件最终要被链接在一起生成可执行文件。 (2)链接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接。 2.静态链接由链接器在链接时将库的内容直接加入到可执行程序中 ①编译静态库源码:gcc–c lib.c –o lib.o转载 2018-02-03 14:32:43 · 168 阅读 · 0 评论 -
值得学习的C语言开源项目
值得学习的C语言开源项目1.WebbenchWebbench是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力。Webbench使用C语言编写, 代码实在太简洁,源码加起来不到600行。下载链接:https://github.com/L转载 2018-02-03 15:25:25 · 291 阅读 · 0 评论 -
C语言中__attribute__ ((at())绝对定位的应用
C语言中的关键字__attribute__ ,当时大一学C语言中没有接触过,后来工作中搞RFID的蓝牙标签卡开发,用的是MSP430G2332,直接用的是绝对定位:1 const uint8_t flash_data[TX_PLOAD_WIDTH]@"CARDNO"={0x11,0x22,0x33,0x44,0x55,0x01}; //然后设定CARDNO对应的flash地址,在.xcl文件...转载 2018-08-29 17:28:10 · 4908 阅读 · 1 评论