#include "sys.h"
#include "delay.h"
#include "led.h"
#include "includes.h"
//USB相关
#include "usb_lib.h"
#include "hw_config.h"
#include "usbio.h"
#include "malloc.h"
extern uint8_t USB_Received_Flag;//USB接收到数据标志位
uint8_t Ins_Flag = 0;
uint8_t Ins_Count = 0;
uint8_t Ins_Table[64];
uint8_t Ins_Table_Copy[64];
uint8_t Ins_Table_Flag = 0;
uint8_t i ;
/************************************************
************************************************/
/UCOSII任务设置///
//START 任务
//设置任务优先级
#define START_TASK_PRIO 10 //开始任务的优先级设置为最低
//设置任务堆栈大小
#define START_STK_SIZE 64
//任务堆栈
OS_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *pdata);
//触摸屏任务
#define TOUCH_TASK_PRIO 9
#define TOUCH_STK_DIZE 64
OS_STK TOUCH_TASK_STK[ TOUCH_STK_DIZE] ;
void TOUCH_TASK(void *pdata);
//LED0任务 模拟蜂鸣器
//设置任务优先级
#define LED0_TASK_PRIO 3
//设置任务堆栈大小
#define LED0_STK_SIZE 64
//任务堆栈
OS_STK LED0_TASK_STK[LED0_STK_SIZE];
//任务函数
void led0_task(void *pdata);
//LED1任务
//设置任务优先级
#define LED1_TASK_PRIO 6
//设置任务堆栈大小
#define LED1_STK_SIZE 64
//任务堆栈
OS_STK LED1_TASK_STK[LED1_STK_SIZE];
//任务函数
void led1_task(void *pdata);
//主任务 通过查询消息,根据消息,执行LED1 LED0 触摸屏任务等等
#define MAIN_TASK_PRIO 5
#define MAIN_STK_DIZE 128
OS_STK MAIN_TASK_STK[ MAIN_STK_DIZE] ;
void MAIN_TASK(void *pdata);
//USB数据处理任务
#define USB_DATA_TASK_PRIO 4
#define USB_DATA_STK_DIZE 64
OS_STK USB_DATA_TASK_STK[ USB_DATA_STK_DIZE] ;
void USB_DATA_TASK(void *pdata);
//消息队列显示
#define QMSGSHOW_TASK_PRIO 7
#define QMSGSHOW_STK_DIZE 128
OS_STK QMSGSHOW_TASK_STK[ QMSGSHOW_STK_DIZE] ;
void qmsgshow_TASK(void *pdata);
OS_EVENT *mes_key; //模拟按键邮箱指针
OS_EVENT *sem_beep; // 蜂鸣器信号量指针
OS_EVENT *q_msg ; // 消息队列
void * MsgGrp[256];// 消息队列存储地址,最大支持256个消息
u8 send_data[256] ; // 要发送的消息
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
USB_Interrupts_Config();
Set_USBClock();
/* 配置USB D+ 线为全速模式 */
//USB_Cable_Config2 (ENABLE);
USB_Init();
my_mem_init(SRAMIN); //初始化内部内存池
OSInit();
OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
OSStart();
}
//开始任务
void start_task(void *pdata)
{
OS_CPU_SR cpu_sr=0; // OS_ENTER_CRITICAL(); OS_EXIT_CRITICAL(); 有用到
pdata = pdata;
mes_key = OSMboxCreate( (void *) 0 ); // 创建消息邮箱
sem_beep = OSSemCreate(0); // 创建信号量
q_msg = OSQCreate(& MsgGrp[0], 256 ); //创建消息队列
// OS_Q * pq = (OS_Q *)q_msg->OSEventPtr;
OSStatInit(); //初始化CPU统计任务.这里会延时 1 秒钟左右 //比如得到CPU使用率
OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)
OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);
// OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);
OSTaskCreate(USB_DATA_TASK,(void *)0, (OS_STK*)& USB_DATA_TASK_STK[USB_DATA_STK_DIZE-1], USB_DATA_TASK_PRIO);
OSTaskCreate(TOUCH_TASK,(void *)0, (OS_STK*)& TOUCH_TASK_STK[TOUCH_STK_DIZE-1], TOUCH_TASK_PRIO);
OSTaskCreate(qmsgshow_TASK,(void *)0, (OS_STK*)& QMSGSHOW_TASK_STK[QMSGSHOW_STK_DIZE-1], QMSGSHOW_TASK_PRIO);
// OSTaskCreate(MAIN_TASK,(void *)0,(OS_STK*)&MAIN_TASK_STK[MAIN_STK_DIZE-1],MAIN_TASK_PRIO);
OSTaskSuspend(LED0_TASK_PRIO );
OSTaskSuspend(QMSGSHOW_TASK_PRIO );
OSTaskSuspend(START_TASK_PRIO); //挂起起始任务.
OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)
}
void qmsgshow_TASK(void *pdata)
{
u8 *p; u8 err; u8 i = 0 ;
OS_Q_DATA query;
while(1)
{
OSQQuery(q_msg ,& query );
USB_SendData32A( query.OSNMsgs ,"L");
delay_ms(100);
p = OSQPend(q_msg , 0 , &err );
// USB_SendData32A( *p ,"Y");
USB_SendData( p ,13);
delay_ms(100);
}
}
//用于给消息队列发送消息
void TOUCH_TASK(void *pdata)
{
u8 *p; u8 err;
static u8 msg_cnt = 0; //msg 编号
p = mymalloc( SRAMIN,13); // //申请 13 个字节的内存 //不能用局部变量传到消息队列,除非每次都malloc 空间
while(1)
{
if(p)
{
msg_cnt++ ;
send_data[msg_cnt ] = msg_cnt ;
USB_SendData32A( msg_cnt ,"S");
// delay_ms(100);
// sprintf((char*)p,"ALIENTEK %03dA",msg_cnt);
// sprintf((char*)p,"%03d",msg_cnt);
err = OSQPost( q_msg , send_data + msg_cnt ); // 先进先出FIFO
if( err != OS_ERR_NONE)
{
// USB_SendData32A( msg_cnt ,"S");
OSTaskSuspend( QMSGSHOW_TASK_PRIO);
}
}
delay_ms(500);
}
}
//LED0任务 //测试,提示程序运行状态
void led0_task(void *pdata)
{
u8 *p; u8 err;
while(1)
{
OS_Q_DATA query;
OSQQuery(q_msg ,& query );
USB_SendData32A( query.OSNMsgs ,"T");
// p = OSQAccept(q_msg , &err);
p = OSQPend(q_msg , 0 , &err );
delay_ms(200);
USB_SendData32A( *p ,"Y");
// USB_SendData( p ,12);
delay_ms(100);
}
}
//LED1任务 //
void led1_task(void *pdata)
{
static uint16_t i=0;
while(1)
{
i = ( i+1 + 20) % 20 ; // 模运算 i = 0~19循环
// USB_SendData32A( i ,"R");
// LED1=0;
// delay_ms(3);
// LED1=1;
delay_ms(500);
};
}
//USB_DATA_TASK任务 、、测试按键扫描任务,优先级最高,得到消息通过消息邮箱发送出去
void USB_DATA_TASK(void *pdata)
{
u8 key;
while(1)
{
if( Ins_Flag == 2){
Ins_Table_Flag = 1;
for( i = 0 ; i < 64 ; i++){
Ins_Table_Copy[i ] = Ins_Table[i];
}
Ins_Table_Flag = 0;
switch(Ins_Table_Copy[1] ){
case 'C' :USB_SendData( (uint8_t *) "CE",sizeof("CE")/sizeof(uint8_t)); break;
case 'D' : OSTaskSuspend(LED0_TASK_PRIO ); break; // 挂起任务
case 'F' : OSTaskResume(LED0_TASK_PRIO ); break; // 恢复任务
case 'G' : OSTaskSuspend(TOUCH_TASK_PRIO ) ; break ; //挂起任务
case 'K' : OSTaskResume(TOUCH_TASK_PRIO); break ;
// case 'G' : OSTaskDelReq(LED1_TASK_PRIO ) ; break ; //发送删除LED1任务请求
// case 'K' : OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);
break;
case 'L' : OSTaskSuspend(QMSGSHOW_TASK_PRIO ); break; // 挂起任务
case 'l' : OSTaskResume(QMSGSHOW_TASK_PRIO ); break; // 恢复任务
//模拟用消息邮箱发送数据
case 'T' : key = 1 ;OSMboxPost(mes_key , (void *)key ); break;
case 'Y' : key = 2 ;OSMboxPost(mes_key , (void *)key ); break;
case 'U' : key = 3 ;OSMboxPost(mes_key , (void *)key ); break;
case 'I' : key = 4 ;OSMboxPost(mes_key , (void *)key ); break;
case 'O' : key = 5 ;OSMboxPost(mes_key , (void *)key ); break;
default : USB_SendData( (uint8_t *) "PE",sizeof("PE")/sizeof(uint8_t)); break;
}
Ins_Flag = 0 ;
}
delay_ms(10);
};
}