我是靠谱客的博主 可爱康乃馨,最近开发中收集的这篇文章主要介绍NIOS II 10:操作系统多任务,看门狗,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在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:操作系统多任务,看门狗所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部