📄 时钟中断.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 + -