您的位置 首页 传感器

AVR单片机c程序设计编程经常见的问题总结剖析

AVR单片机c程序设计编程时常见的问题总结分析-1.int (*func)(void)–基本函数指针变量定义方式,变量func是一个指向返回值为int,没有参数的函数指针,这与其他变量定义有点区别,一般是把变量名放最后,如int a,而函数指针比较不直观,

2.typedef int(*ftype)(void); ftype func;–类型重定义方式,先定义一种新的类型ftype,它是一种指针类型,这种类型专门指向返回值为int,没有参数的函数,再通过该类型定义一个具体的变量func

3.func=functionName–函数指针赋值,functionName为已经定义的函数的函数名

这两天在用AVR单片机做项目,这次是边做边深化学,尽量将曾经疏忽的常识用上,比方指针、文件包括、条件编译、变量效果域等逐个调研清楚。收成不少,再次体会到学习的进程中没有无用的当地。用的越深化,才发现学时认为没用的东西都是最有用的,由于都被疏忽了。幸而学习时分的最重要的《c程序设计》假如不能解决,就找编译器的问题。这是这段时刻总结的经历。

AVR单片机c程序设计编程经常见的问题总结剖析

一、函数指针

1.int (*func)(void)–底子函数指针变量界说方法,变量func是一个指向返回值为int,没有参数的函数指针,这与其他变量界说有点差异,一般是把变量名放最终,如int a,而函数指针比较不直观,

2.typedef int(*ftype)(void); ftype func;–类型重界说方法,先界说一种新的类型ftype,它是一种指针类型,这种类型专门指向返回值为int,没有参数的函数,再经过该类型界说一个详细的变量func

3.func=funcTIonName–函数指针赋值,funcTIonName为现已界说的函数的函数名

4.(*func)()–经过函数指针调用函数,也能够直接调用func(),

5.函数指针的一般效果:刚学函数指针的时分感觉没啥用,在触摸操作体系以及一些音讯、事情驱动的机制今后意识到它的含义。简略的讲假如期望在产生某种事情、中止等状况下不期望主程序再去检查、扫描做判别,而是主动履行某个功用函数时分,能够运用回调函数完成。如每次按下键盘都让某个灯亮,能够将亮灯的函数指针传递给按键中止函数,由中止内部主动调用。这是比较简略的运用,必定能够直接用一个函数替代,可是一旦期望在履行进程中修正该音讯、中止呼应的操作的话,用函数指针就便利多了。在正常的程序履行进程中,调用方一般都是遇到函数就当即履行。而回调函数则是调用方经过函数指针的方法把函数储存起来。这样在适宜的实践调用方就能够经过这个函数指针履行某个功用。回调函数能够说是一种订阅、分发的机制。被调用方能够经过订阅的方法将自己的处理函数以函数指针的方法交给调用方。当调用方需求履行这个回调函数的时分,就会经过分发的方法回调被调用方。回调函数的机制能够说无处不在,比方Channie Liu 所说的MFC音讯机制,再比方HOOK,等等都是经过回调函数机制来履行的。可是回调函数并不是体系独有的机制。你完全能够在自己的程序中经过函数指针来完成一套回调函数。还有回调函数并不是面向对象编程,在某些状况下能够运用观察者形式来替代它。在.net中现已运用是事情的方法替代了回调函数来完成音讯相应。

6.avr编程中要注意不是一切的编译器都能很好的支撑函数指针,运用以及查材料发现ICCAVR7.1某个版别在编译后的代码进行仿真发现程序总是跑飞,检查汇编发现生成一个EIJMP指令(扩展直接跳转指令),后来测验换用最新版7.21A版别,发现这个编译后就没这个指令,能够正常仿真了。一同CodeVision也有这个版别的问题。

二、头文件包括

曾经一向认为对这个很了解,没太介意,尽管也犯了几回过错,但都没有深究,这次又温习了一下“谭浩强”发现仍是有底子的误解的。在对头文件了解之前需求了解编译进程。编译是以源文件为单位,也便是*.c++或*.c++等,生成的方针文件也是与源文件对应的。而头文件的效果是把或许共用的声明放在一同,被源文件包括后,在编译的进程中能够了解为直接加在源文件的内部,并且增加的次序与源文件的include句子次序对应。所以假如A.c包括B.h,而B.h又用到C.h内容,但B.h自身没包括则在A.c中要注意先包括C.h再包括B.h。别的便是变量的界说,即需求请求内存占用内存这样的句子不能放在或许被多处包括的头文件中,这样会引发屡次界说的过错。这个问题我一向认为在头文件的开端和结束有个#ifndef句子就万事大吉了,后来才知道不是那么回事。#ifndef句子仅仅为了在A包括B,A包括C,B包括C这样状况下阻挠C被两次包括,而假如还有一个D也包括C的话那么A与D两个源文件编译后的代码中都会对C中的变量进行界说的,然后形成变量屡次界说。

三、条件编译

这个没太多用过,直到最近想把单片机的程序写的更通用一些,尽量能笼统出来一些共用的函数,能够在各个硬件渠道运用,免除不少的重复作业。如串口通讯在51下,在avr下都写过,可是每次都是现用现写,现在想尽量把每种功用硬件相关部分提炼出来,并压缩到最小。这儿边就需求用到条件编译对各种渠道进行判别,对每种功用进行操控。看过嵌入式linux内核的应该都发现这个特点了,那便是成篇的条件编译。

四、变量效果域

我最常犯的便是全局变量与静态变量的过错运用。详细能够看“谭浩强”,这儿只阐明一下常用的全局变量的运用。有时分期望一个公共变量能在各个源文件拜访,或许作为某种信号、开关运用。就需求在某个源文件中界说,然后在其他需求用到的当地运用extern关键字。假如需求用的当地太多,就在头文件中运用extern声明该变量,在其他源文件中包括该头文件即可。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/chuanganqi/347017.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部