“alt_types.h”头文件定义了数据类型,;system.h是你在建立软件工程后伴随产生的,;对于#include"stdio.h&;当然有区别;#include"stdio.h&qu;当要调用某个函数时;先在用户自已编写的文件中查找,如果找不到再到库文;而#include<stdio.h>;所以如果是调用自己写的函数的
“alt_types.h”头文件定义了数据类型,如下所示:
system.h是你在建立软件工程后伴随产生的,而altera_avalon_pio_regs.h,alt_types.h是你安装完ide就会有的。
对于#include"stdio.h "这种形式,不同编译器的寻找方法可能不同的。而#include<stdio.h> 都是在自己的include目录里面寻找。
当然有区别
#include"stdio.h "
当要调用某个函数时
先在用户自已编写的文件中查找,如果找不到再到库文件里去找,
而#include<stdio.h> 是直接到库文件里去找
所以如果是调用自己写的函数的话就用#include"stdio.h ",这种形式
而调用标准库函数的话就用#include<stdio.h> 这种形式,可以提高速度
文件包含include有三种形式的控制指令
1:#include <文件名>
将把该行替换为文件名指定的文件的内容。文件名不能包含> 或换行符。 如果文件名包含字符 " ' \ 或 /* 则行为没有定义。
预处理器将在某些特定的位置查找指定的文件
如:在tc下 Options->Directories-> Include directories:
可以设置include目录 (如:c:\TURBOC2\INCLUDE)
2:#include "文件名 "
首先从原文件的位置开始搜索指定文件,如果没有找到指定的文件则按第一种的方式处理。
如果文件名包含字符 ' \ 或 /* 则行为没有定义。可以使用字符> 3:#include 记号序列
它将按照扩展普通文本的方式扩展记号序列进行解释。记号序列必须被解释为 <..> 或 ".. "
两种形式之一,然后再按照上述方式进行处理。
#define SSS<stdio.h>
#include SSS
void main()
{ printf("Hello!\n ");
}
#include文件可以嵌套。
stdio.h是输入输出头文件,所有有关输入输出的语句如"printf","scanf","putchar","getchar"等,都要用该头文件,头文件其实就是定义了这些函数的文件,它是系统提供给我们的接口 math.h是再进行数学运算时要包含的头文件,它提供了取绝对值,开方,求幂等数学运算#include<conio.h>与#include<stdio.h> 一样,是头文件包含。
这个头文件包含有许多库函数像#include<stdio.h>包含printf与
scanf一样,getch()也是其中一个函数,它的功能是无回显得到一
字符,常用这个函数做密码之类的程序。在TC中编译不需要加头文件
可以,编译器默认包含。就像在TC是不用加#include<stdio.h>一样。
但在VC中编译就要加了。否则系统认为你的函数没有定义。
其它头文件你只要再TC文件夹中看看include这个文件夹里面的文件就可以了
引子
以前版本的sys/alt_irq.h,我在这里就不多说了;此处仅浅析9.1版本的增强版的sys/alt_irq.h。
浅析
1 增强版的API
表1 增强版的HAL中断的API
2 先前的HAL中断API
3 写ISRalt_irq_register() alt_irq_disable() alt_irq_enable() alt_irq_disable_all()alt_irq_enable_all() alt_irq_interruptible() alt_irq_non_interruptible()alt_irq_enabled()
(1)使用增强版中断API注册ISR
intalt_ic_isr_register(alt_u32 ic_id,
alt_u32 irq,
alt_isr_func isr,
void *isr_context,
void* flags)
? ic_id为中断控制器标号,定义于system.h之中。在使用菊花链的EIC中,ic_id使用菊花链标识EIC;在IIC中,ic_id则不重要。
? irq为设备的硬件中断号,定义于system.h之中。
? 对于IIC来讲,irq就是IRQ号。中断的优先级与IRQ的编号成相反顺序。故IRQ_0代表最高优先级的中断,IRQ_31则是最低优先级的。
?
? 对于EIC来讲,irq就是中断端口的ID。 isr_context指向与设备驱动实例相关的数据结构体。isr_context传递输入参数给中断服务程序的函数。用于传递特定上下文的信息给ISR,也可指向任何特定ISR的信息。该上下文的值对于HAL是不透明的;it is providedentirely for the benefit of the user-defined ISR。
? isr指向相应的IRQ号的irq调用的ISR函数的指针。ISR函数原型如下: voidhandle_button_interrupts(void* isr_context);
给该函数提供的输入参数就是isr_context。
注: 给isr注册空指针,将会导致中断失去使能;handle_button_interrupts为isr服务函数名称,不固定。
?
flags保留未用。
(2)使能或者去使能中断
增强版的中断API提供如下函数:alt_ic_irq_disable(),alt_ic_irq_enable(),alt_ic_irq_enabled(),alt_irq_disable_all(),alt_irq_enable_all()。
? alt_irq_enable()允许编程以使某些部分的代码禁用硬件中断,或此后重新使能它们。
?
?alt_ic_irq_disable()和alt_ic_irq_enable()允许使能或去使能单独的中断。alt_irq_disable_all()去使能所有中断,并返回一上下文值。
? 欲重新使能硬件中断,可调用alt_irq_enable_all(),并传递上下文参数。中断在返回状态的优先级之前调用alt_irq_disable_all()。
?
? 若可屏蔽的异常被使能,则alt_irq_enabled()返回非零值。alt_ic_irq_enabled()则决定那个被指定的中断被使能。
(3)升级至增强版的HAL中断
表2 升级HAL中断的API
(4)支持多种HAL中断的API
在软件编译工具中选择中断API,使用system.h中的如下符号来定义其中之一,来标识哪种中断API可用:
?
?ALT_ENHANCED_INTERRUPT_PRESENT——定义使用增强版的API实现ALT_LEGACY_INERRUPT_API_PRESENT——定义使用先前的API实现 在用户的驱动代码中,使用这些符号来决定哪种API被调用。
(5)使用HAL注册按键中断的C范例
#include"system.h" #include"sys/alt_irq.h" #include"altera_avalon_pio_regs.h" // 定义全局变量以储存边沿捕获值 volatile intedge_capture; // 初始化button_pio static voidinit_button_pio() { // 改写edge_capture指针以匹配alt_irq_register()函数原型 voidedge_capture_ptr = (void) &edge_capture;