混合信号嵌入式设计实验指南-数字实验之:实验2—中断
下面给出了代码的例子(也可用于Lab2C)
#include m8c.h> // part specific constants and macros
#include PSoCAPI.h // PSoC API definitions for all User Modules
extern unsigned char bShadow=0; void main(void)
{
PRT1DR=0;
INT_MSK0|=0x40;
M8C_EnableGInt;
while(1)
{
M8C_Sleep; //sleep commandbShadow++; PRT1DR=bShadow;
}
}
1.2.4 实验2D—汇编器中断服务例程
步骤1:创建新的工程。复制Lab2C,将其命名为Lab2D。
所有参数和跳线连接保持一样。重新生成应用。
步骤2:修改代码。创建新的名字为SleepTimerRoutines.asm 的汇编文件。打开该文件,并按照图1.16 所示添加代码。
图1.16 SleepTimer 中断服务程序
需要注意这个工程中的一些条目:
保存累加器的值,以后从堆栈中恢复。中断硬件只保护程序计数器和标志寄存器,这是一个中断服务程序的最小要求。其他主程序使用的寄存器也需要保护。这通常是通过将它们暂存在堆栈中实现的。
bShadow 是一个在main.c 中声明的全局变量。当使用汇编语言时,必须在这个变量前加一个下划线。反之,任何一个在汇编文件中定义的全局变量,必须以下划线开头,为了让C 例程能找到它。
例程以reti 结尾。—打开boot.asm 文件,在休眠定时器向量位置放置如下代码:ljmp SleepTimerISR 练习2D-1 :这个指令要求多少个字节?
重新生成工程。
打开boot.asm ,并且验证刚才输入的代码消失了,这是因为当每次重新生成工程时,每次都重写boot.asm 。对于这个地方的代码,必须输入到用于生成boot.asm 的模板文件。
打开boot.tpl ,将下面的代码放到休眠定时器向量位置。
ljmp SleepTimerISR
重新生成工程。
打开boot.asm ,验证代码现在驻留在正确的向量位置。
打开main.c 文件,删除控制循环内的所有代码。程序始终处于这个循环,一直等到在休眠定时器中断服务程序中为休眠定时器服务为止。
重新建立工程,下载到Eval1 板子,并运行。
像前面一样验证程序。
1.2.5 实验2E—C 语言中断服务例程
步骤1:创建新的工程。
复制Lab2D,将其命名为Lab2E。
所有参数和跳线连接保持一样。
重新生成应用。
步骤2:修改代码。
删除名字为SleepTimerRoutines.asm 的汇编文件。
打开main.c 文件,并按照图1.17 所示添加代码。
图1.17 Lab2C 控制软件
需要注意这个工程中的一些条目:
Pragma 允许一个函数被用做一个中断句柄。编译器将自动添加必要的代码来保护它所使用的任何寄存器。它被用做一个也添加reti。当然,这样一个函数不能接受参数和返回一个结果。
练习2E-1:为什么?
将必要的代码添加到该函数中,实现前面的汇编中断服务程序。打开boot.tpl ,转到休眠定时器向量,在SleepTimerISR 前面添加下划线。注意:对于在C 中声明的函数和变量,添加下划线。如果在C 中声明了一个变量
CVar ,则在汇编例程中作为_iCVar 使用,在C 中作为iCVar 使用。如果_iAsmVar 在汇编语言中声明为一个变量,则它在汇编例程中作为_iASmVar 使用,在C 例程中作为iCVar 使用。iAsmVar 是一个在汇编语言中声明的变量,它可以在汇编例程中作为iASmVar 使用,但在C 中不可使用。
重新生成应用,重新建立工程,下载到Eval1 板子,运行;像前面一样验证程序。
评论