概述
在NIOS II 9基础上修改,关于elipse工程每次最好新建,否则莫名其妙的一些错误,还不如新建工程把代码拷进来快。
在更改了硬件部分时,来到elipse一定要重新生成bsp,如果报错,可以clean再生成bsp
任务控制8个LED闪烁。
1、控制LED闪烁,就要加入#include "altera_avalon_pio_regs.h"头文件。
由于我定义的PIO是双向的,所以要首先给出方向。定义方向首先加入#include "system.h"头文件
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_0_BASE, 0xff); 八个管脚方向都是输出。
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_0_BASE, 0x00); 关闭IO口所有中断
任务如下LED每200ms状态反转一次,经验证没问题,8个灯状态对的。
2、第二个任务串口发送,每500ms一次
3、第三个任务自己新建一个任务,每800ms串口发送一次
首先定义任务堆栈大小 OS_STK task3_stk[TASK_STACKSIZE];
定义任务优先级 #define TASK3_PRIORITY 3
之后写任务函数
主函数初始化任务
4、可见三个任务都在执行
5、看门狗加入,任务4,完成打开看门狗,并且每500ms喂狗一次。因为我们硬件设置喂狗时间是1S,所以这个不能大于1S。
看门狗要使用定时器:#include "altera_avalon_timer_regs.h" 加入头文件。
由于我们在硬件部分设置看门狗时选用的32bit寄存器。看手册,寄存器定义如下。
状态寄存器如下,两位有用
控制寄存器
6、通过上面看到,开启看门狗只需要往控制寄存器的start位写1.然后定时喂狗就可以了。喂狗操作就是往period里写任意数。
IOWR_ALTERA_AVALON_TIMER_PERIODL(WATCHDOG_BASE, 0x55);//写任意数清零看门狗
IOWR_ALTERA_AVALON_TIMER_CONTROL(WATCHDOG_BASE, 0x04); //开启看门狗
7、整个工程如下
#include <stdio.h>
#include "includes.h"
#include "altera_avalon_pio_regs.h"
#include "system.h"
#include "altera_avalon_timer_regs.h"
alt_u8 led;
/* Definition of Task Stacks */
#define TASK_STACKSIZE 2048
OS_STK task1_stk[TASK_STACKSIZE];
OS_STK task2_stk[TASK_STACKSIZE];
OS_STK task3_stk[TASK_STACKSIZE];
OS_STK task4_stk[TASK_STACKSIZE];
/* Definition of Task Priorities */
#define TASK1_PRIORITY 1
#define TASK2_PRIORITY 2
#define TASK3_PRIORITY 3
#define TASK4_PRIORITY 4
/* Prints "Hello World" and sleeps for three seconds */
void task1(void* pdata)
{
alt_u8 i=0;
led=0x00;
while (1)
{
led=~led;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, led);
printf("task1is%dn,",i);
i++;
OSTimeDlyHMSM(0, 0, 0, 200);
}
}
/* Prints "Hello World" and sleeps for three seconds */
void task2(void* pdata)
{
while (1)
{
printf("task2n");
OSTimeDlyHMSM(0, 0, 0, 500);
}
}
void task3(void* pdata)
{
while (1)
{
printf("task3n");
OSTimeDlyHMSM(0, 0, 0, 800);
}
}
void task4(void* pdata)
{
IOWR_ALTERA_AVALON_TIMER_PERIODL(WATCHDOG_BASE, 0x55); //写任意数清零看门狗
IOWR_ALTERA_AVALON_TIMER_CONTROL(WATCHDOG_BASE, 0x04); //开启看门狗
while (1)
{
printf("task4n");
OSTimeDlyHMSM(0, 0, 0, 500);
IOWR_ALTERA_AVALON_TIMER_PERIODL(WATCHDOG_BASE, 0x55); //写任意数清零看门狗
}
}
/* The main function creates two task and starts multi-tasking */
int main(void)
{
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_0_BASE, 0xff);
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_0_BASE, 0x00);
OSTaskCreateExt(task1,
NULL,
(void *)&task1_stk[TASK_STACKSIZE-1],
TASK1_PRIORITY,
TASK1_PRIORITY,
task1_stk,
TASK_STACKSIZE,
NULL,
0);
OSTaskCreateExt(task2,
NULL,
(void *)&task2_stk[TASK_STACKSIZE-1],
TASK2_PRIORITY,
TASK2_PRIORITY,
task2_stk,
TASK_STACKSIZE,
NULL,
0);
OSTaskCreateExt(task3,
NULL,
(void *)&task3_stk[TASK_STACKSIZE-1],
TASK3_PRIORITY,
TASK3_PRIORITY,
task3_stk,
TASK_STACKSIZE,
NULL,
0);
OSTaskCreateExt(task4,
NULL,
(void *)&task4_stk[TASK_STACKSIZE-1],
TASK4_PRIORITY,
TASK4_PRIORITY,
task4_stk,
TASK_STACKSIZE,
NULL,
0);
OSStart();
return 0;
}
8、运行结果
最后
以上就是可爱康乃馨为你收集整理的NIOS II 10:操作系统多任务,看门狗的全部内容,希望文章能够帮你解决NIOS II 10:操作系统多任务,看门狗所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复