OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7043|回复: 9

高手求教,触摸屏任务根本进不去

[复制链接]

29

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-7-25
在线时间
0 小时
发表于 2013-8-29 19:57:22 | 显示全部楼层 |阅读模式
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "malloc.h"
#include "spi.h"
#include "lcd.h"
#include "stmflash.h"
#include "touch.h"
#include "24l01.h"
#include "includes.h" 
//开始任务
#define START_TASK_PRIO 10 //开始任务的优先级设置为最低
#define START_STK_SIZE 64 //设置任务堆栈大小
OS_STK START_TASK_STK[START_STK_SIZE]; //任务堆栈
void start_task(void *pdata); //任务函数

//无线发送任务
#define WIRELESSTRANSMIT_TASK_PRIO 6
#define WIRELESSTRANSMIT_STK_SIZE 64
OS_STK WIRELESSTRANSMIT_TASK_STK[WIRELESSTRANSMIT_STK_SIZE];
void wirelesstransmit_task(void *pdata);

//触摸屏任务
#define TOUCH_TASK_PRIO 7 //设置任务优先级
#define TOUCH_STK_SIZE 64 //设置任务堆栈大小
OS_STK TOUCH_TASK_STK[TOUCH_STK_SIZE]; //任务堆栈
void touch_task(void * pdata); //任务函数

//画点任务
#define DRAWPIONT_TASK_PRIO 8
#define DRAWPIONT_STK_SIZE 64
OS_STK DRAWPOINT_TASK_STK[DRAWPIONT_STK_SIZE];
void drawpoint_task(void * pdata);

//无线接收任务
#define WIRELESSRECEIVE_TASK_PRIO 5
#define WIRELESSRECEIVE_STK_SIZE 64
OS_STK WIRELESSRECEIVE_TASK_STK[WIRELESSRECEIVE_STK_SIZE];
void wirelessreceive_task(void *pdata);


//OS_EVENT msg_key; //按键消息邮箱
OS_EVENT * q_msg1; //消息队列1,用于触摸屏任务和无线发送通信
OS_EVENT * q_msg2; //消息队列2,用于无线接收和画点的通信
OS_TMR   * tmr1; //软件定时器1
void * MsgGrp1[256]; //消息队列1存储地址,最大支持256个消息
void * MsgGrp2[256]; //消息队列2存储地址,最大支持256个消息
//软件定时器1的回调函数
//没100ms执行一次,用于显示CPU使用率和内存使用率
void tmr1_callback(OS_TMR *ptmr,void *p_arg)
{
static u16 cpuusage=0;
static u8 tcnt=0;
POINT_COLOR=BLUE;
if(tcnt==5)
{
LCD_ShowxNum(182,10,cpuusage/5,3,16,0); //显示CPU使用率
tcnt=0;
cpuusage=0;
}
cpuusage+=OSCPUUsage;
tcnt++;
LCD_ShowxNum(182,30,mem_perused(SRAMIN),3,16,0); //显示内存使用率
LCD_ShowxNum(182,50,((OS_Q*)(q_msg1->OSEventPtr))->OSQEntries,3,16,0X80);//显示队列1当前的大小
LCD_ShowxNum(182,70,((OS_Q*)(q_msg2->OSEventPtr))->OSQEntries,3,16,0X80);//显示队列2当前的大小
}
//加载主界面
void ucos_load_main_ui(void)
{
LCD_Clear(WHITE); //清屏
/* POINT_COLOR=RED; //设置字体为红色 
LCD_ShowString(10,10,200,16,16,"WarShip STM32");
LCD_ShowString(10,30,200,16,16,"UCOSII TEST3");
LCD_ShowString(10,50,200,16,16,"ATOM@ALIENTEK");
    LCD_ShowString(10,75,240,16,16,"TPAD:TMR2 SW   KEY_UP:ADJUST");
    LCD_ShowString(10,95,240,16,16,"KEY0S0 KEY1 SW KEY2:CLR");
  LCD_DrawLine(0,70,lcddev.width,70);
LCD_DrawLine(120,0,120,70);

  LCD_DrawLine(0,120,lcddev.width,120);
  LCD_DrawLine(0,220,lcddev.width,220);
LCD_DrawLine(120,120,120,lcddev.height);
   
  LCD_ShowString(5,125,240,16,16,"QUEUE MSG");//队列消息
LCD_ShowString(5,150,240,16,16,"Message:");  
LCD_ShowString(5+120,125,240,16,16,"FLAGS");//信号量集
LCD_ShowString(5,225,240,16,16,"TOUCH"); //触摸屏
LCD_ShowString(5+120,225,240,16,16,"TMR2"); //队列消息*/
POINT_COLOR=BLUE;//设置字体为蓝色 
  LCD_ShowString(150,10,200,16,16,"CPU:   %");
    LCD_ShowString(150,30,200,16,16,"MEM:   %");
    LCD_ShowString(150,50,200,16,16,"Q1 :000");
LCD_ShowString(150,70,200,16,16,"Q2 :000");
delay_ms(300);
}

int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
uart_init(72,9600); //串口初始化为9600
delay_init(72);   //延时初始化 
LCD_Init();   //初始化LCD
mem_init(SRAMIN); //初始化内部内存池
    tp_dev.init();
    NRF24L01_Init(); //初始化无线模块
ucos_load_main_ui(); 

OSInit();   //初始化UCOSII
  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;
u8 err;
pdata=pdata;
// msg_key=OSMboxCreate((void *)0); //创建消息邮箱
q_msg1=OSQCreate(&MsgGrp1[0],256); //创建信号量
q_msg2=OSQCreate(&MsgGrp2[0],256);
// flags_key=OSFlagCreate(0,&err);
OSStatInit(); //初始化统计任务,这里会有1s左右的延时

tmr1=OSTmrCreate(10,10,OS_TMR_OPT_PERIODIC,(OS_TMR_CALLBACK)tmr1_callback,0,"tmr1",&err); //100ms执行一次
OSTmrStart(tmr1,&err); //启动软件定时器
OS_ENTER_CRITICAL();
OSTaskCreate(drawpoint_task,(void *)0,(OS_STK *)&DRAWPOINT_TASK_STK[DRAWPIONT_STK_SIZE-1],DRAWPIONT_TASK_PRIO);
OSTaskCreate(wirelessreceive_task,(void *)0,(OS_STK *)&WIRELESSRECEIVE_TASK_STK[WIRELESSRECEIVE_STK_SIZE-1],WIRELESSRECEIVE_TASK_PRIO);
OSTaskCreate(wirelesstransmit_task,(void*)0,(OS_STK *)&WIRELESSTRANSMIT_TASK_STK[WIRELESSTRANSMIT_STK_SIZE-1],WIRELESSTRANSMIT_TASK_PRIO);
OSTaskCreate(touch_task,(void *)0,(OS_STK *)&TOUCH_TASK_STK[TOUCH_STK_SIZE-1],TOUCH_TASK_PRIO);
// OSTaskCreate(main_task,(void *)0,(OS_STK *)&MAIN_TASK_STK[MAIN_STK_SIZE-1],MAIN_TASK_PRIO);
OSTaskSuspend(START_TASK_PRIO); //挂起任务
OS_EXIT_CRITICAL();
}


//触摸屏任务
void touch_task(void * pdata)
{
u8 xoy_index=0;
short *p;
u8 err;
p=mymalloc(SRAMIN,32); //申请32个字节的内存
if(!p)
{
OSTaskSuspend(TOUCH_TASK_PRIO); // 申请失败,则挂起任务
}
while(1)
{
tp_dev.scan(0);
if(tp_dev.sta & TP_PRES_DOWN) //触摸屏被按下
{
if(!(tp_dev.x >150 && tp_dev.y<100))
{
TP_Draw_Big_Point(tp_dev.x,tp_dev.y,RED); //画图
p[xoy_index++]=tp_dev.x; //将字节存入数组
p[xoy_index++]=tp_dev.y;
if(xoy_index==16) //32个字节已满,可以发送了
{
err=OSQPost(q_msg1,p); //发送队列
if(err!=OS_ERR_NONE) //发送失败
{
myfree(SRAMIN,p); //释放内存
OSTaskSuspend(TOUCH_TASK_PRIO); //挂起任务
}
p=mymalloc(SRAMIN,32); //再申请32个字节的内存用于存放坐标
if(!p)
{
OSTaskSuspend(TOUCH_TASK_PRIO); // 申请失败,则挂起任务
}
}
delay_ms(2);
}
}else delay_ms(10); //没有按键按下的时候
}
}

//无线发送任务
void wirelesstransmit_task(void *pdata)
{
OS_CPU_SR cpu_sr=0;
u8 *p;
u8 err;
u8 retry;
while(1)
{
p=OSQPend(q_msg1,0,&err); //获取要发送的包
OS_ENTER_CRITICAL(); //进入临界区
NRF24L01_TX_Mode(); //发送模式
while(NRF24L01_TxPacket(p)!=TX_OK && retry<200) //发送数据
{
retry++;
delay_us(1);
}
OS_EXIT_CRITICAL(); //退出临界区
myfree(SRAMIN,p); //即使是没有发送完成,也丢掉
delay_ms(5);
}
}

//无线接收任务
void wirelessreceive_task(void *pdata)
{
OS_CPU_SR cpu_sr=0;
u8*p;
u8 err;
p=mymalloc(SRAMIN,32); //申请32个字节的内存
if(!p)
{
OSTaskSuspend(WIRELESSRECEIVE_TASK_PRIO); // 申请失败,则挂起任务
}
while(1)
{
OS_ENTER_CRITICAL();
NRF24L01_RX_Mode();
if(NRF24L01_RxPacket(p)==0) //一旦接收到信息,则送进消息队列2
{
err=OSQPost(q_msg2,p); //发送队列
if(err!=OS_ERR_NONE) //发送失败
{
myfree(SRAMIN,p); //释放内存
OSTaskSuspend(WIRELESSRECEIVE_TASK_PRIO); //挂起任务
}
}
OS_EXIT_CRITICAL();
delay_ms(5);
}
}
//画点函数
void drawpoint_task(void * pdata)
{
// OS_CPU_SR cpu_sr=0;
short *p;
u8 i;
u8 err;
while(1)
{
p=(short *)OSQPend(q_msg2,0,&err); //请求队列
for(i=0;i<16;i=i+2)
{
TP_Draw_Big_Point(p,p[i+1],RED); //画点
}
myfree(SRAMIN,p); //释放内存
delay_ms(2);

}
}
我想完成的功能是:在一个屏上画,能在另一个屏上也显示出来,结果触摸屏任务根本不进,导致无线发送任务,无线接收任务和画点任务只进一次就挂起了。然后就是不停地执行软件定时器任务。求指导啊,为什么啊?哪里出错了


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-8-29 21:26:49 | 显示全部楼层
你只留下触摸屏任务试试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

29

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-7-25
在线时间
0 小时
 楼主| 发表于 2013-8-30 09:24:40 | 显示全部楼层
还是进不去
回复 支持 反对

使用道具 举报

29

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-7-25
在线时间
0 小时
 楼主| 发表于 2013-8-30 09:46:18 | 显示全部楼层
而且不知道怎么回事,当我再次把全部任务开启之后,硬件调试的时候,除了软件定时器能进去,其他的也都进不去了,好郁闷
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-8-30 10:16:40 | 显示全部楼层
一个任务都进不了,问题大,呵呵。
直接在我们的例程基础上修改吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

29

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-7-25
在线时间
0 小时
 楼主| 发表于 2013-8-30 10:34:36 | 显示全部楼层
我就是在你的例程基础上改的。软件定时器的任务可以进去
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-8-30 17:26:15 | 显示全部楼层
我们的例程运行很正常哇。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

29

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-7-25
在线时间
0 小时
 楼主| 发表于 2013-8-31 02:14:53 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
我把我的代码下载到你的板子上,所有的任务都能运行,但是相同的代码在我的板子上就不行,而且有时候所有任务都不进,有时候只进画点任务和发送任务,接收任务和触摸屏任务都不进,这是怎么回事?cfg-h里的配置和你一模一样啊。忘记说了,我是用的VET6的主控,
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-8-31 11:10:52 | 显示全部楼层
那你先试试最简单的吧。比如任务调度那个例程,看看能跑起来不。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

29

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-7-25
在线时间
0 小时
 楼主| 发表于 2013-9-1 13:24:53 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
找到问题了,是VET6这款芯片对生成变量时,默认不是0
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 23:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表