📄 test.c
字号:
/*
*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
*
* (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
* All Rights Reserved
*
* EXAMPLE #1
*********************************************************************************************************
*/
#include "includes.h"
#include "AT91FR.h"
#define USER_MODE 0x10
#define FIP_MODE 0x11
#define IRQ_MODE 0x12
#define SVC_MODE 0x13
#define SYS_MODE 0x1F
/*
*********************************************************************************************************
* CONSTANTS
*********************************************************************************************************
*/
#define TASK_STK_SIZE 512 /* Size of each task's stacks (# of WORDs) */
#define N_TASKS 2 /* Number of identical tasks */
/*
*********************************************************************************************************
* VARIABLES
*********************************************************************************************************
*/
OS_STK TaskStk[N_TASKS][TASK_STK_SIZE]; /* Tasks stacks */
OS_STK TaskStartStk[TASK_STK_SIZE];
U8 TaskData[N_TASKS]; /* Parameters to pass to each task */
OS_EVENT *RandomSem;//,*RandomSem1;
/*
*********************************************************************************************************
* FUNCTION PROTOTYPES
*********************************************************************************************************
*/
void Task(void *data); /* Function prototypes of tasks */
void TaskStart(void *data); /* Function prototypes of Startup task */
static void TaskStartCreateTasks(void);
/*********************************************************************************************************
* MAIN
*********************************************************************************************************
*/
void delay(void)
{
U32 i ;
for(i=2000000;i>0;i--);
}
void LED1_control(U8 stat)
{
if(stat==0)
PIO_CODR = (1<<16);
else
PIO_SODR = (1<<16);
}
void LED2_control(U8 stat)
{
if(stat==0)
PIO_CODR = (1<<17);
else
PIO_SODR = (1<<17);
}
void TargetIint(void) //目标系统初始化
{
U32 i;
AIC_IDCR = 0xFFFFFFFF; // disable all interrupts
PS_PCER = 0x17c; // Enable Parallel IO Clock//0x17c enable all parallel
PIO_PER = 0xF1FFF; // use P0-P12,P16-P19
PIO_ODR = 0xC1CFF; // use P0-P7,P10-P12,P18-P19 for input
PIO_OER = 0x30300; // use P8-P9,P16-P17 for output
SF_PMR = 0x27A80020; // AIC Protect mode enable
AIC_EOICR = 0xFFFFFFFF; // End-of-interrupt command
AIC_ICCR=0xFFFF; //清除中断
for(i=5;i>0;i--){
LED1_control(1);
LED2_control(1);
delay();
LED1_control(0);
LED2_control(0);
delay();
}
}
extern void Time0_irq(void);
void Time0_init(void) //时钟初始化
{
volatile U32 tend;
TC0_CCR=0x02; //clk disable/
TC0_IDR=0xffffffff; //禁止所有TC0的中断
AIC_SVR4=(U32)Time0_irq;//中断服务程序
AIC_SMR4=0x24; //中断优先级4
tend=TC0_SR; //读出状态以取消中断
TC0_CMR=0xC002; //MCK/32=4us,CPCSTR,WAVE,
TC0_RC =25000 ; //要匹配的值,每100MS中断一次
AIC_IECR=0x10; //允许TC0中断
TC0_IER=0x10; //允许匹配时中断/
TC0_CCR=0x01; //clk enable//
TC0_CCR=0x05; //software triger couter start
}
void Time0_IRQhandler(void)
{
U32 stat;
AIC_IVR = 0; //debug
stat=TC0_SR;
AIC_ICCR = 0x00000010; // Clear timer #0 interrupt
AIC_EOICR=stat;//中断退出/
OSTimeTick();
}
int main (void)
{
//LED1_control(1);
TargetIint();
/*Time0_init() ; //时钟初始化
while(1){
LED1_control(1);
delay();
LED1_control(0);
delay();
}*/
OSInit(); /* Initialize uC/OS-II */
RandomSem = OSSemCreate(1); /* Random number semaphore */
//RandomSem1 = OSSemCreate(1); /* Random number semaphore */
OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);///
OSStart(); /* Start multitasking */
}
/*
*********************************************************************************************************
* STARTUP TASK
*********************************************************************************************************
*/
void TaskStart (void *pdata)
{
//#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
// OS_CPU_SR cpu_sr;
//#endif
//char s[100];
//INT16S key;
//INT8U err;
pdata = pdata; /* Prevent compiler warning */
Time0_init() ; //时钟初始化
// OS_ENTER_CRITICAL();
// PC_VectSet(0x08, OSTickISR); /* Install uC/OS-II's clock tick ISR */
// PC_SetTickRate(OS_TICKS_PER_SEC); /* Reprogram tick rate */
// OS_EXIT_CRITICAL();
// OSStatInit(); /* Initialize uC/OS-II's statistics */
TaskStartCreateTasks(); /* Create all the application tasks */
for (;;) {
/* Update the display */
//OSSemPost(RandomSem); /* Release semaphore */
//OSSemPend(RandomSem, 0, &err); /* Acquire semaphore to perform random numbers */
OSTimeDly(15);
LED1_control(1);
OSTimeDly(15);
LED1_control(0);
}
}
/*********************************************************************************************************
* CREATE TASKS
*********************************************************************************************************
*/
static void TaskStartCreateTasks (void)
{
INT8U i;
for (i = 0; i < N_TASKS; i++) { /* Create N_TASKS identical tasks */
TaskData[i] = '0' + i; /* Each task will display its own letter */
OSTaskCreate(Task, (void *)&TaskData[i], &TaskStk[i][TASK_STK_SIZE - 1], i + 1);
}
}
/*
*********************************************************************************************************
* TASKS
*********************************************************************************************************
*/
void Task (void *pdata)
{
// INT8U x;
// INT8U y;
INT8U err;
for (;;) {
OSSemPend(RandomSem, 0, &err); /* Acquire semaphore to perform random numbers */
if(*(U8*)pdata=='0')
LED2_control(1);
else
LED2_control(0);
OSSemPost(RandomSem); /* Release semaphore */
OSTimeDly(4); /* Delay 1 clock tick */
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -