C/C++
polarisyj86
这个作者很懒,什么都没留下…
展开
-
(*(volatile unsigned int *))详解
使用一个32位处理器,要对一个32位的内存地址进行访问,可以这样定义#define RAM_ADDR (*(volatile unsigned long *)0x00000000)然后就可以用C语言对这个内存地址进行读写操作了 读:tmp = RAM_ADDR; 写:RAM_ADDR = 0x55; volatile的意思是说明这个变量是可能被别的程序或者本程序的其他线程修改的,这样编译器就不能优...转载 2018-05-24 16:37:19 · 3817 阅读 · 0 评论 -
***WARNING L15: MULTIPLE CALL TO SEGMENT 错误详解和解决方案
转自:https://www.cnblogs.com/CuriosityWzk/archive/2011/12/25/2301090.html今天来说说*** WARNING L15: MULTIPLE CALL TO SEGMENT这个问题! 其实这个问题应该是引起注意的,有可能引起程序冲突,但是一般时候程序运行不会有问题,但是如果出来问题,那将会是很讨厌的问题.分析一下 产生...转载 2018-08-03 10:55:12 · 34354 阅读 · 3 评论 -
keil的51单片机仿真调试中如何查看内存的内容
转自:点击打开在Memory窗口中输入地址值,得到的结果是程序代码区的内容。由于51采用的是哈佛结构,程序指令存储和数据存储分开。要查看各种内存区域的内容,只要在Address框内输入“字母:地址”即可显示相应的内存值。其中字母可以是C、D、I、X,分别代表的意义是: C:代码存储空间 D:直接寻址片内存储空间 I :间接寻址片内存储空间 X:扩展的外部RAM空间如...转载 2018-08-15 18:18:02 · 9191 阅读 · 0 评论 -
C语言运算符优先级(超详细)
每当想找哪个运算符优先级高时,很多时候总是想找的就没有,真让人气愤!现在,终于有个我个人觉得非常全的,分享给大家,欢迎拍砖!转自:点击打开C语言运算符优先级 优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [...转载 2018-08-30 19:43:39 · 56679 阅读 · 5 评论 -
Tutorial about USB HID Report Descriptors
Forward Since: https://eleccelerator.com/tutorial-about-usb-hid-report-descriptors/This page is from my old website, and it is sort of popular, so I’ve moved it here.A USB HID report descriptor is...转载 2018-12-17 09:48:51 · 434 阅读 · 0 评论 -
在Linux内核中增加新驱动模块
转自:点击打开开发环境开发板:A33-Vstar开发板系统: Linux/arm 3.4.39 KernelUbuntu版本:Ubuntu14.04----------------------------------------------------新增内核驱动,并可以通过make menuconfig配置。内核完整路径:~/A33-Vstar/dragonbo...转载 2019-06-04 20:09:19 · 3434 阅读 · 0 评论 -
Linux内核中的常用宏container_of的解释
转发:点击打开开发平台:Ubuntu11.04编 译器:gcc version 4.5.2 (Ubuntu/Linaro4.5.2-8ubuntu4)Container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址。Container_o...转载 2019-06-25 21:00:08 · 213 阅读 · 0 评论 -
浅谈linux中的根文件系统(rootfs的原理和介绍)
转自:点击打开linux中有一个让很多初学者都不是特别清楚的概念,叫做“根文件系统”。我接触linux前前后后也好几年了,但是对这个问题,至今也不是特别的清楚,至少没法给出一个很全面很到位的解释。于是,今天我们就来理一理这个话题。一、先交代一下文件系统在开始讨论根文件系统这个话题之前,我们必首先交代一下文件系统这个概念。毕竟,根文件系统只是文件系统中的一种比较特殊的形式而已。根据伟大的...转载 2019-07-03 10:58:11 · 23330 阅读 · 0 评论 -
Linux设备驱动之platform按键驱动
转自:点击打开1. platform设备模型原理从Linux 2.6起引入了一套新的驱动管理和注册机制,platform_device和platform_driver,Linux中大部分的设备驱动都可以使用这套机制。platform是一条虚拟的总线。设备用platform_device表示,驱动用platform_driver进行注册,Linux platform driver机制和传统的...转载 2019-07-29 15:24:27 · 316 阅读 · 0 评论 -
linux内核module_platform_driver宏解析
该函数实际是一个宏,module_platform_driver在include/linux/platform_device.h中定义如下:/* module_platform_driver() - Helper macro for drivers that don't do * anything special in module init/exit. This eliminates ...原创 2019-07-30 16:33:36 · 1474 阅读 · 0 评论 -
Linux字符设备驱动开发之内存读写的应用实例
字符设备是Linux系统三大类设备之一(字符设备、块设备、网络设备),作为Linux最简单的一类设备,字符设备常用来传输一些简单的控制命令或者少量的数据。本篇文章分享了如何在Linux内核中创建一个字符设备,并在应用程序中测试该设备的实例。该字符设备通过在内核中创建一段内存空间,并将这段空间作为字符设备读写访问的目标地址,来实现Linux内核字符设备驱动与应用程序的通信。1. 操作系统Li...原创 2019-08-02 12:53:06 · 1999 阅读 · 1 评论 -
Keil51:Error 212: Indirect call: Parameters do not fit within registers
参考:http://www.keil.com/support/docs/2066.htmInformation in this article applies to:C51 All Versions Cx51 All VersionsSYMPTOMSI'm using function pointers and object-oriented(面向对象的) programming ...转载 2018-08-02 17:50:34 · 2837 阅读 · 0 评论 -
C语言中指向函数的指针
1 定义和调用程序在编译后,每个函数都有一个首地址(也就是函数第一条指令的地址),这个地址称为函数的指针。可以定义指向函数的指针变量,使用指针变量间接调用函数。下面通过一个简单的例子来说明:float max(float x,float y){return x>y?x:y;}float min(float x,float y){return x<y?x:y;}main(){float ...转载 2018-05-30 17:36:12 · 1029 阅读 · 0 评论 -
C语言回调函数总结
对指针的应用是C语言编程的精髓所在,而回调函数就是C语言里面对函数指针的高级应用。简而言之,回调函数是一个通过函数指针调用的函数。如果你把函数指针(函数的入口地址)传递给另一个函数,当这个函数指针被用来调用它所指向的函数时,我们就说这个函数是回调函数。 为什么要使用回调函数呢?我们先看一个小例子: Node * Search_List (Node * node, const int value...转载 2018-06-13 15:45:47 · 401 阅读 · 0 评论 -
c语言中__attribute__的意义
我们在进行定义数据结构计算数据结构大小的时候,或者进行网络通讯的socket发送数据的时候,都会遇到一个共同的问题:数据对齐问题。这个问题是硬件为提高访问数据的效率,引出的问题,这里就不具体说这样为什么可以提高数据的访问效率,有兴趣的人,网上都有。既然这个问题是实实在在存在的,并且软件发展了这么多年,也肯定有破解之道,下面就简单的介绍常见的3种方法:1. 手动对齐,根据自己定义的数据结构,...转载 2018-06-22 15:45:05 · 274 阅读 · 0 评论 -
在C51语言中如何嵌入汇编语言
keil C 语言中嵌入汇编语言进行混合编程,方法如下:1、在C 文件中要嵌入汇编代码片以如下方式加入汇编代码#pragma ASM; Assembler Code Here#pragma ENDASM2、在Project 窗口中包含汇编代码的C 文件上右键,选择“Options for ...”在弹出的对话框中,点击右边的“Generate Assembler SRC File”和“Assemb...转载 2018-06-22 16:09:08 · 5363 阅读 · 1 评论 -
单片机C51串口printf的使用方法
串口printf的使用函数原型如下:void USART0_Printf(char *fmt,...)//这个是我们的printf函数{ char* ap; //typedef char *va_list; va_list是char型的指针 charxdata string[128]; //访问外部RAM 两字节对齐 va_start(ap,fmt); //这个函数的功能是,找到第一个可变形...转载 2018-06-22 17:50:15 · 7798 阅读 · 0 评论 -
inline内联的用法与作用
inline内联的用法与作用 内联函数是一种编译机制,优点从代码上是看不出来的,但是程序的执行效率上有差别,通常,编译器对函数调用的处理是一种类似中断的方式,即当执行到函数调用语句时,程序把当前所有的状态信息比如CPU所有寄存器(其中一个很重要的就是指令指针寄存器)的值保存起来,然后放心大胆地转去执行那个函数的代码,执行完后再返回原来的地方,恢复原先保存过的状态信息,于是也就可以接着原来被...转载 2018-06-25 10:25:04 · 509 阅读 · 0 评论 -
C语言中宏定义(#define)时do{}while(0)的价值
最近在新公司的代码中发现到处用到do{...}while(0),google了一下,发现Stack Overflow上早有很多讨论,总结了一下讨论,加上自己的理解,do{...}while(0)的价值主要体现在:1. 增加代码的适应性下面的宏定义没有使用do{...}while(0)#define FOO(x) foo(x); bar(x);这样宏定义,单独调用不会出现问题,例如:FOO(100)...转载 2018-06-29 15:09:48 · 228 阅读 · 1 评论 -
嵌入式C语言软件结构注意事项
模块划分的"划"是规划的意思,意指怎样合理的将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求。C语言作为一种结构化的程序设计语言,在模块的划分上主要依据功能(依功能进行划分在面向对象设计中成为一个错误,牛顿定律遇到了>相对论),C语言模块化程序设计需理解如下概念:(1) 模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明;(2) 某模块提供给其它模块...转载 2018-06-20 11:11:03 · 307 阅读 · 0 评论 -
Keil中如何消除UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS警告
在Keil C中,如果没有显式调用到定义过的函数,就会出现这样的的警告。当出现这样的警告时,可以不用管,因为不影响其它部分。但是,我们知道,即使没有调用这个函数,Keil仍然把它编译连接进整个程序,不过浪费点ROM倒是不心疼。最主要的是,在这个函数中的变量,不会被列入覆盖分析范围内,也就是说这些变量占的空间不能被回收,这对于为数不多的RAM资源可是巨大的浪费啊。。。当这个不被调用的函数写在C文件中...转载 2018-06-27 18:02:09 · 13263 阅读 · 1 评论 -
STM32芯片在IAR平台实现打印输出到串口功能
要在STM32上使用打印输出到串口功能,基本思路是重定义putchar或者fputc函数,实现方法如下(以芯片STM32F4xx系列为例):#define USE_IAR#ifdef USE_IAR #define PUTCHAR_PROTOTYPE int putchar(int ch)#else #define PUTCHAR_PROTOTYPE int fputc(in...原创 2018-07-11 15:19:41 · 2295 阅读 · 0 评论 -
Linux驱动卸载时出现“Device 'xxx' does not have a release() function, it is broken and must be fixed”的解决办法
在用platform bus方法编写Linux内核驱动模块时,在模块卸载过程中,如果系统出现提示“Device 'xxx' does not have a release() function, it is broken and must be fixed.” 说明系统在卸载是找不到release()函数,这个函数对应在结构体struct platform_device中的成员struct dev...原创 2019-08-21 10:48:15 · 1612 阅读 · 0 评论