文章摘要:
Nios2已经移植好了ucos2的相关代码,只需要进行简单的配置即可使用;


硬件平台:EP4CE6F17C8
开发环境:Quartus II 13.1/Nios II 13.1
参考文档:Nios II Software Developer’s Handbook


添加SysTick定时器
由于ucos2需要一个毫秒级的系统时钟来实现节拍(Time Tick),所以需要创建一个周期为1ms的Interval Timer组件;


创建基于ucos2的BSP
创建基于ucos2的BSP


BSP配置
BSP配置


示例代码:

#include "regs.h"
#include "unistd.h"
#include <os_cfg.h>
#include <ucos_ii.h>
#include <stdio.h>
//----------------------------------
OS_STK LedTaskStk[OS_TASK_TMR_STK_SIZE];
void LedTask(void *pdata)
{
    for(;;)
    {
        rLEDS = 0x55;
        //OSTimeDlyHMSM(0,0,0,100);
        OSTimeDly(500);
        //OSTaskSuspend(OS_PRIO_SELF);
        rLEDS = 0xAA;
        //OSTaskSuspend(OS_PRIO_SELF);
        OSTimeDly(500);
        //OSTimeDlyHMSM(0,0,0,100);
    }
}
//----------------------------------
// 数码管显示表(共阳极显示)
char smg_table[16] = {
    0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
    0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
};    

OS_STK SmgTaskStk[OS_TASK_TMR_STK_SIZE];
void SmgTask(void *pdata)
{
    int val;
    for(;;)
    {
        val = OSTimeGet();  // 获取tick,并显示
        rSMG0 = (int)smg_table[val%10];
        rSMG1 = (int)smg_table[(val/10)%10];
        rSMG2 = (int)smg_table[(val/100)%10];
        rSMG3 = (int)smg_table[(val/1000)%10];
        rSMG4 = (int)smg_table[(val/10000)%10];
        rSMG5 = (int)smg_table[(val/100000)%10];
        OSTimeDly(50);    
    }
}

//----------------------------------
int main(void)
{
    OSInit();
    rTIMER_CR = 0x07;
    OSTaskCreate(LedTask,0,&LedTaskStk[OS_TASK_TMR_STK_SIZE-1],1);
    OSTaskCreate(SmgTask,0,&SmgTaskStk[OS_TASK_TMR_STK_SIZE-1],2);

    OSStart();

    return 0;
}