⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 时钟中断.c

📁 这个程序演示嵌入式实时操作系统μC/OS中中断的使用情况
💻 C
字号:
/**********************************************************************************************************
 * 
 *				                电子科技大学嵌入式软件工程中心 版权所有
 * 					
 * 								Copyright (C) 2007 UESTC ESEC
 *
 **********************************************************************************************************/

/**********************************************************************************************************
 * 模块: init.c
 * 目的:
 *      这个程序演示要体现内核的内存分配思想的策略。为此,设计了内存的分配和回收,完成一系列动作。
 **********************************************************************************************************/

#include "../ucos/includes.h"
#include "../bsp/Uart.h"

extern T_UART_PORT uartPort0;
extern void ucBsp_Init(void);
extern void Timer_Start(void);
extern void CPSR_Init(void);

/*
*********************************************************************************************************
*                                               CONSTANTS
*********************************************************************************************************
*/

#define          TASK_STK_SIZE     512                /* Size of each task's stacks (# of WORDs)       */
#define          TASK_START_ID       0                /* Application tasks IDs                         */
#define          TASK_START_PRIO    10                /* Application tasks priorities                  */
#define          TASK_1_PRIO        12
#define          TASK_2_PRIO        13
#define          TASK_3_PRIO        14
#define	         N_TASKS			 5				  /* Number of tasks                               */

/*
*********************************************************************************************************
*                                              VARIABLES
*********************************************************************************************************
*/

OS_STK        TaskStartStk[TASK_STK_SIZE];                        /* Startup    task stack              */
OS_STK        Task1Stk[TASK_STK_SIZE];                            /* Task #1    task stack              */
OS_STK        Task2Stk[TASK_STK_SIZE];                            /* Task #2    task stack              */
OS_STK        Task3Stk[TASK_STK_SIZE];                            /* Task #3    task stack              */
OS_EVENT      *InterruptSem;
OS_STK	      TaskStk[N_TASKS][TASK_STK_SIZE/sizeof(OS_STK)];	  /*   Tasks stacks                     */

/*
*********************************************************************************************************
*                                         FUNCTION PROTOTYPES
*********************************************************************************************************
*/

		void  TaskStart(void *data);                              /* Function prototypes of tasks        */
static  void  TaskStartCreateTasks(void);
        void  Task1(void *data);
		void  Task2(void *data);
		void  Task3(void *data);

/*
*********************************************************************************************************
*                                               VARIABLES
*********************************************************************************************************
*/

typedef struct {
    char    TaskName[30];
    INT16U  TaskCtr;
    INT16U  TaskExecTime;
    INT32U  TaskTotExecTime;
} TASK_USER_DATA;

TASK_USER_DATA  TaskUserData[7];

/*
*********************************************************************************************************
*                                                MAIN
*********************************************************************************************************
*/

int  main (void)
{
	//板级初始化
	ucBsp_Init();	
	//open the interrupt bit 'I'
	CPSR_Init();
	//Initialize uC/OS-II
    OSInit();

	Uart_PutString(uartPort0,"\t本程序演示uC/OS-II时钟管理的基本思想和策略: ");
	Uart_PutLine(uartPort0,"");
	Uart_PutString(uartPort0,"请按任意键继续......");
	Uart_GetChar(uartPort0);
	Uart_PutLine(uartPort0,"");

    OSTaskCreateExt(TaskStart,
                    (void *)0,
                    &TaskStartStk[TASK_STK_SIZE - 1],
                    TASK_START_PRIO,
                    TASK_START_ID,
                    &TaskStartStk[0],
                    TASK_STK_SIZE,
                    &TaskUserData[TASK_START_ID],
                    0);
	//Start multitasking
    OSStart();
	return 1;
}

/*
*********************************************************************************************************
*                                              STARTUP TASK
*********************************************************************************************************
*/

void  TaskStart (void *pdata)
{
	INT16S     key;
	int i;
	pdata = pdata;
	key=key;
	i=i;
	
	Timer_Start();
	//create 1 signal
	InterruptSem=OSSemCreate(1);
	//Create all the application tasks
	TaskStartCreateTasks();
	//Suspend  the TaskStart 
	OSTaskSuspend(OS_PRIO_SELF);
}

/*
*********************************************************************************************************
*                                             CREATE TASKS
*********************************************************************************************************
*/

void  TaskStartCreateTasks (void)
{
	OSTaskCreate(Task1,(void *)0,&Task1Stk[TASK_STK_SIZE - 1],TASK_1_PRIO);
	OSTaskCreate(Task2,(void *)0,&Task2Stk[TASK_STK_SIZE - 1],TASK_2_PRIO);
	OSTaskCreate(Task3,(void *)0,&Task3Stk[TASK_STK_SIZE - 1],TASK_3_PRIO);
}

/*
*********************************************************************************************************
*                                             Task1
*********************************************************************************************************
*/

void  Task1 (void *pdata)
{
INT8U  err;
pdata=pdata;

	for (;;)
	{
		//task1 delay 100 clock ticks
		OSTimeDly(10);

		//Acquire semaphore to get into the room
		Uart_PutLine(uartPort0, "Task__1(getting semaphore)");
		OSSemPend(InterruptSem, 0, &err);
		Uart_PutLine(uartPort0,"Task__1(got the semaphore)");
		
		Uart_PutLine(uartPort0,"Task__1(delaying......)");
		OSTimeDly(20);
		
		Uart_PutLine(uartPort0,"Task__1(delay finished)");
		Uart_PutLine(uartPort0,"Task__1(release semaphore)");
		Uart_PutLine(uartPort0,"");
		//Release semaphore
		OSSemPost(InterruptSem);
		
		OSTimeDly(20);

	}
}

/*
*********************************************************************************************************
*                                             Task2
*********************************************************************************************************
*/

void Task2 (void *pdata)
{
	INT8U err;	
	pdata=pdata;
	
	for (;;)
	{
		Uart_PutLine(uartPort0, "Task__2(getting semaphore)");
		//Acquire semaphore to get into the room
		OSSemPend(InterruptSem, 0, &err);
		Uart_PutLine(uartPort0, "Task__2(got the semaphore)");
		Uart_PutLine(uartPort0,"Task__2(delaying......)");
		//task2 delay 500 clock ticks
		OSTimeDly(50);
		
		//		  OSTimeDly(100);
		Uart_PutLine(uartPort0,"Task__2(delay finished)");
		Uart_PutLine(uartPort0,"Task__2(release semaphore)");
		//Release semaphore
		OSSemPost(InterruptSem);
		OSTimeDly(20);
		//		  Uart_PutString(uartPort0,"Task2 is waitting.\n\r");
		Uart_PutLine(uartPort0,"");
		
	}
}

/*
*********************************************************************************************************
*                                             Task3
*********************************************************************************************************
*/

void  Task3 (void *pdata)
{
	pdata=pdata;
	for (;;)
	{
		Uart_PutLine(uartPort0,"Task__3(got cpu):\t1");
		OSTimeDly(10);
		Uart_PutLine(uartPort0,"Task__3(got cpu):\t2");
		OSTimeDly(10);
		Uart_PutLine(uartPort0,"Task__3(got cpu):\t3");
		OSTimeDly(10);
		Uart_PutLine(uartPort0,"Task__3(got cpu):\t4");
		OSTimeDly(10);
		Uart_PutLine(uartPort0,"");
	}
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -