Calendar
载入中。。。
Placard
载入中。。。
Category
载入中。。。
Latest Entries
载入中。。。
Latest Comments
载入中。。。
Last Messages
载入中。。。
User Login
载入中。。。
Links
Information
载入中。。。
Search
Other


Welcome to my blog!
  接系统移植2
 

四、让你的操作系统执行跑马灯任务
在这一部分,你将要在扩展板上运行一个你自己设计的MicroC/OS-II程序。
1
打开ucosii_tutorial.c
2
头文件加入如下代码
#i nclude "system.h"
#i nclude "altera_avalon_pio_regs.h"
#i nclude "alt_types.h"

3 加入定义任务优先级代码             
OS_STK    my_task1_stk[TASK_STACKSIZE];
#define MY_TASK1_PRIORITY         13


4
在初始化函数 initCreateTasks函数中加入一下代码
return_code = OSTaskCreateExt(my_task1,
                             NULL,
                             (void *)&my_task1_stk[TASK_STACKSIZE],
                             MY_TASK1_PRIORITY,
                             MY_TASK1_PRIORITY,
                             my_task1_stk,
                             TASK_STACKSIZE,
                             NULL,
                             0);
  alt_ucosii_check_return_code(return_code);

5 增加执行跑马灯的任务的代码
void my_task1(void* pdata)
{
  alt_u8 led = 0x2;
  alt_u8 dir = 0;
  volatile int i;     
  while (1) 
  {
    if (led & 0x81) 
    {
      dir = (dir ^ 0x1);
    }

    if (dir) 
    {
      led = led >> 1;
    } 
    else 
    {
      led = led << 1;
    }
    IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, led);
 OSTimeDlyHMSM(0, 0, 1, 0);//
延迟1
  }
}
6
选择Run As > Nios II Hardware (Run menu)创建程序,下载它到试验板中并运行。下载完成后,可以看到除了函数使控制台视图周期性更新,你试验板上的LED灯也周期性的亮灭。

NiosII 的中断处理方式带有典型的RISC处理器的特征,所有的中断处理都从同一入口进入,然后由软件加以分配。负责分配工作的软件叫系统ISR,它是由开发系统提供的,自动的连接到可执行程序上。系统ISR维护着一个中断向量表,表中的每一项代表着一个专项处理程序的入口。所有的专项处理程序都是由用户定义然后注册到中断向量表中的,叫做用户ISR。系统ISR的入口地址是在SOPC_Builder中定义的,叫Exception Address。和中断有关的CPU寄存器有:ctl0ctl1ctl3ctl4Ctl0 是程序状态字,它的bit0位是全局中断允许位,1代表允许,0代表禁止。Ctl0是程序状字的堆栈,当发生中断时,由它保留一个程序状态字的备份。Ctl3是中断允许寄存器,其中每一位控制着一个中断源,1代表允许,0代表禁止,共计32位。Ctl4是中断申请寄存器,每一位对应着一个中断源的中断请求,1代表有中断,0代表没有******32位。

  NiosII的中断处理过程是这样的:
1
 考备一份程序状态字到ctl1
2
 清除全局中断允许位PIE,禁止中断;
3
 将下一条将执行的指令的地址存入R29,以便中断返回之用;
4
 跳转到中断入口地址,进入系统ISR
5
 系统ISR保护现场;
6
 系统ISR检测ctl1PIE位,如为0则进入软中断处理程序从11继续,否则由7继续;
7
 系统ISR检测Ctl4,如果有中断申请,则转到硬中断处理和序,否则进入软中断处理程序;
8
 硬中断处理程序将检测中断申请号,并检索中断向量表,跳转到用户中断处理程序;
9
 用户中断处理程序做出具体的处理,最后返回系统ISR
10
 系统ISR恢复现场,并返回;
11
 软中断处理程序进行陷井指令、模拟指令判断,并做相应处理,然后返回系统ISR
12
 系统ISR恢复现场并返回;

  软中断处理程序是用来处理由软件发起的中断事件的,包括调试指令引起的中断及未定义指令引起的中断。目前未定义指令的处理主要为乘、除法运算指令的处理,不支持用自定义的操作码,除用户自己修改系统程序。如果软中断处理程序遇到了一个不识别的操作码,将返回一个不确定的结果。
与用户编程相关API函数有:
1
 alt_irq_register();
2
 alt_irq_disable();
3
 alt_irq_enble();
4
 alt_irq_disable_all();
5
 alt_irq_enable_all();
alt_irq_register()
是向系统ISR注册用户ISRAPI函数。其原形为:
     int alt_irq_register( alt_u32 id,
                     void *context,
                     void (* isr)(void *, alt_u32))
     id 
代表被服务的中断向量号;
     context 
是运行参数指针,将来作为第一个参数传给用户ISR
     Isr 
是一个函数指针,指向用户ISR入口;
如果注册成功,函数返回0,并允许全局中断及被服务中断;不成功返回非0值。
Alt_irq_disable()
用来禁止某个中断服务。原形为:
                   Int alt_irq_disable(alt_u32 id)
                   Id 
为对应的中断号;
                   
返回值为0;
alt_irq_enable()
alt_irq_disable()对应,用来开启某个中断服务。原形为:
                   int alt_irq_enable(alt_u32 id)
alt_irq_disable_all()
用于关闭全局中断,原形为:
                   alt_irq_context alt_irq_disable_all(void)
                   
返回值为中断控制寄存器的值。
Alt_irq_enable_all()
用于开启全局中断,原形为:
                   void alt_irq_enable_all( alt_irq_context context)
                   context 
代表中断控制寄存器的值。
用户定义的用户ISR程序要符合统一的原形定义,即:
            void isr(void * context, alt_u32 id)
函数名没特别的要求,与一般函数一样。入口参数与返回值要严格按标准形式定义,否则系统ISR将不能正确的对其调用。

 

[ 阅读全文 | 回复(0) | 引用通告 | 编辑

  Post  by  jearome 发表于 2006-9-6 12:31:00
发表评论:
载入中。。。
载入中。。。