main.c
来自「freesacle的实时操作系统UCOS的开发程序」· C语言 代码 · 共 484 行
C
484 行
/*---------------------------------------------------------------------------
*
* 文件名:
*
* *说明:
* (1)在允许中断嵌套的情况下,把中断的分开上下两部分处理..下部分主要是
* 以任务的形式..但可能消耗RAM的资源.定义各对应的中断服务任务**ISRTask()..
* (2)不允许中断嵌套的情况下,中断的ISR尽量少处理一些动作.同时系统的
* 的时钟频率要小一些较好...
*
* 以下在允许中断嵌套的情况下的..
*
*
*------------------------------------------------------------------------------
*/
#include <mc9s12dg128.h>
#include "Includes.h"
#include "ATD.h"
#include "PWM.h"
#include "Uart.h"
#include "Timers.h"
#include "display.h"
#include "main.h"
#include "ctrl.h"
#include "lcd.h"
#define BUSCLK 24000000
#define PREDIV 8
#define SYSCNTVAL BUSCLK/(OS_TICKS_PER_SEC*PREDIV) //系统时钟定时器的计数值
#define up_key 10
#define esc_key 11
#define left_key 12
#define right_key 13
#define down_key 14
#define yes_key 15
////time +
unsigned char counter0,c_counter1,c_counter2; // MCCNT
unsigned int c_time1,c_time2;
unsigned long tm;
int counter_r;
////time -
////speed +
extern unsigned char key;
unsigned int v1,v2;
unsigned char sp_a;
extern unsigned char spd_lock,open_lock;
extern unsigned int sp_d;
extern unsigned char read_key(void);
extern unsigned char key;
int f_a;
extern unsigned int speed_max,speed_min,speed_turn;
extern unsigned char base_duty;
extern unsigned int duty_test ;
unsigned int mu[4];
unsigned char menu_num,next;
////speed -
extern int ssrl,ssr,ssl;
extern char js,zj;
//unsigned int time;
unsigned char b_rgz;
float time_temp;
extern unsigned int duty_test ;
extern float d_old,srl;
extern void kb_test(void) ;
extern void rgz(void);
extern unsigned char gate_ch;
//extern unsigned int data_p;
void main(void) {
unsigned char i;
OSInit();
OSTaskCreate(StartTask,(void *)0, &StartTask_StkSize[OS_TASK_SIZE*4-1],START_TASK_PRIO);
b_rgz=0;
speed=0;
d_old=0;
duty_test=0;
led_re_test();
gate_ch=1;
srl=0;
spd_lock=0;
//data_p=0;
counter0=0;
LCD_Init();
for(i=0;i<64;i++)
lcd_dsp_buff[i]=' ';
update_lcd_display();
sp_a=1;
ssr=0;
ssl=0;
ssrl=0;
js=0;
zj=0;
speed_max=250;
speed_min=150;
speed_turn=170;
base_duty=40;
mu[0]=250;
mu[1]=150;
mu[2]=170;
mu[3]=40;
menu_num=0;
key=0;
next=0;
open_lock=17;
sp_d=0;
PWM1outPut(300,50);
OSStart();
}
/*-----------------------------------------------------------------------
* 开始任务:
* 建立其它任务和任务的通信方式;打开系统的时钟,以及所有的中断,,
*
*/
void StartTask(void *Id )
{
Id=Id;
display(0);
PORTB = 0xf0;
OSTaskCreate(OSTick,(void *)0,&OSTick_StkSize[OS_TASK_SIZE*5-1],OSTICK_PRIO);
OSTaskCreate(Task1,(void *)0, &Task1_StkSize[OS_TASK_SIZE*6-1],TASK1_PRIO);
OSTaskCreate(Task2,(void *)0, &Task2_StkSize[OS_TASK_SIZE*5-1],TASK2_PRIO);
OSTaskCreate(Task3,(void *)0, &Task3_StkSize[OS_TASK_SIZE*5-1],TASK3_PRIO);
OSTaskCreate(Task4,(void *)0, &Task4_StkSize[OS_TASK_SIZE*5-1],TASK4_PRIO);
Mbox_tick=OSMboxCreate(0);
Sem1=OSSemCreate(0);
SystemCLK(); //打开系统时钟及打开中断...
asm{
cli //注:之前中断的总是关闭的..
}
OSTaskDel(OS_PRIO_SELF);
}
/*-----------------------------------------------------------------------
* 任务1
*
*
*
*/
void Task1(void *pdata)
{
INT8U *err;
long int temp;
OS_CPU_SR cpu_sr;
pdata = pdata;
for(;;){
sp_d++;
if(sp_d>300)
sp_d=300;
speed=Speed();
rgz();
if(next==3)
{
speed_ctrl();
//uart_putchar('3');
}
else
{
speed_ctrl_next_1();
//uart_putchar('0');
}
OSSemPend(Sem1,0,err);
}
}
/*-----------------------------------------------------------------------
*任务 2
*
*
*
*/
void Task2(void *pdata)
{
//INT8U *err;
OS_CPU_SR cpu_sr;
//pdata = pdata;
unsigned char key_buff;
pdata = pdata;
for(;;)
{
key_buff=read_key();
OSTimeDly(1);
if(key_buff==read_key())
{
if(key_buff!=0xff)
{ ////////////////////////////////////////////
//key=key_buff;
key=2;
switch(key_buff)
{
case up_key:
menu_num--;
if(menu_num>3)
menu_num=3;
break;
case down_key:
menu_num++;
if(menu_num>3)
menu_num=0;
break;
case right_key:
if(next!=0)
{
next=0;
speed_max=250;
speed_min=150;
speed_turn=170;
base_duty=40;
mu[0]=250;
mu[1]=150;
mu[2]=170;
mu[3]=40;
}
break;
case left_key:
if(next!=1)
{
next=1;
speed_max=250;
speed_min=150;
speed_turn=150;
base_duty=40;
mu[0]=250;
mu[1]=150;
mu[2]=150;
mu[3]=40;
}
break;
case esc_key:
if(next!=3)
{
next=3;
speed_max=230;
speed_min=160;
speed_turn=170;
base_duty=45;
mu[0]=230;
mu[1]=160;
mu[2]=170;
mu[3]=45;
}
break;
case yes_key:
if(next!=4)
{
next=4;
speed_max=260;
speed_min=160;
speed_turn=170;
base_duty=40;
mu[0]=260;
mu[1]=160;
mu[2]=170;
mu[3]=40;
}
speed_max=mu[0];
speed_min=mu[1];
speed_turn=mu[2];
base_duty=(unsigned char)mu[3];
break;
default :
key_buff++;
if(key_buff==10)
key_buff=0;
// uart_putchar(key_buff+0x30);
mu[menu_num]=mu[menu_num]*10+key_buff;
if(mu[menu_num]>500)
mu[menu_num]=key_buff;
speed_max=mu[0];
speed_min=mu[1];
speed_turn=mu[2];
base_duty=(unsigned char)mu[3];
key_buff--;
if(key_buff>10)
key_buff=9;
break;
}
////////////////////////////////////////////////
while(key_buff==read_key())
{
OSTimeDly(5);
}
}
}
} //for -
}
/*-----------------------------------------------------------------------
*任务3
*
*
*
*/
void Task3(void *pdata)
{
//INT8U *err;
pdata = pdata;
for(;;){
open_lock++;
if(open_lock>110)
open_lock=110;
spd_lock++;
if(spd_lock>110)
spd_lock=110;
OSTimeDly(40);
}
}
/*-----------------------------------------------------------------------
*任务4
*
*
*
*/
void Task4(void *pdata)
{
//INT8U *err;
unsigned int i;
pdata = pdata;
for(;;){
if(key==2)
{
lcd_dsp_buff[0]='s';
lcd_dsp_buff[1]='p';
lcd_dsp_buff[2]='e';
lcd_dsp_buff[3]='e';
lcd_dsp_buff[4]='d';
lcd_dsp_buff[5]='_';
lcd_dsp_buff[6]='m';
lcd_dsp_buff[7]='a';
lcd_dsp_buff[8]='x';
lcd_dsp_buff[9]=' ';
lcd_dsp_buff[10]='=';
lcd_dsp_buff[11]=' ';
speed_show(12,speed_max);
lcd_dsp_buff[16]='s';
lcd_dsp_buff[17]='p';
lcd_dsp_buff[18]='e';
lcd_dsp_buff[19]='e';
lcd_dsp_buff[20]='d';
lcd_dsp_buff[21]='_';
lcd_dsp_buff[22]='m';
lcd_dsp_buff[23]='i';
lcd_dsp_buff[24]='n';
lcd_dsp_buff[25]=' ';
lcd_dsp_buff[26]='=';
lcd_dsp_buff[27]=' ';
speed_show(28,speed_min);
lcd_dsp_buff[32]='s';
lcd_dsp_buff[33]='p';
lcd_dsp_buff[34]='e';
lcd_dsp_buff[35]='e';
lcd_dsp_buff[36]='d';
lcd_dsp_buff[37]='_';
lcd_dsp_buff[38]='t';
lcd_dsp_buff[39]='u';
lcd_dsp_buff[40]='r';
lcd_dsp_buff[41]='n';
lcd_dsp_buff[42]='=';
lcd_dsp_buff[43]=' ';
speed_show(44,speed_turn);
lcd_dsp_buff[48]='b';
lcd_dsp_buff[49]='a';
lcd_dsp_buff[50]='s';
lcd_dsp_buff[51]='e';
lcd_dsp_buff[52]='_';
lcd_dsp_buff[53]='d';
lcd_dsp_buff[54]='u';
lcd_dsp_buff[55]='t';
lcd_dsp_buff[56]='y';
lcd_dsp_buff[57]=' ';
lcd_dsp_buff[58]='=';
lcd_dsp_buff[59]=' ';
speed_show(60,base_duty);
}
update_lcd_display();
OSTimeDly(15);
}
}
/*
****************************************************************************************************
*以下的为各中断的服务的任务..
*每一个中断的ISR对应着一个中断服务任务...目的是为更好的支持中断的嵌套..
*/
/*---------------------------------------------------------------------------------------
* 函数: void OSTick(void *pdata).
* 描述: 时钟中断服务任务0 为了实现中断嵌套........
*/
void OSTick(void *pdata)
{
INT8U *err;
pdata = pdata;
for(;;){
OSTimeTick();
OSMboxPend(Mbox_tick,0,err);
}
}
void SysCLK_ISR(void) {
counter0++;
OSMboxPost(Mbox_tick,(void *)0); //唤醒中断服务任务...
MCFLG|=0x80; //清除系统的时钟的中断标志位
}
/*----------------------------------------------------------------------------
*
*
*/
void IOC_ISR(void){
OSSemPost(Sem1);
}
/*---------------------------------------------------------------------------------
*中断服务 ISR任务1/或是简短的中断服务程序...
*
*
*/
void intTask1(void ) {
TFLG2|=0x80; // 清除中断标志位........
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?