完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#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_SIZE64//设置任务堆栈大小OS_STK START_TASK_STK[START_STK_SIZE];//任务堆栈void start_task(void *pdata);//任务函数
//无线发送任务#define WIRELESSTRANSMIT_TASK_PRIO 6#define WIRELESSTRANSMIT_STK_SIZE 64OS_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 64OS_STK DRAWPOINT_TASK_STK[DRAWPIONT_STK_SIZE];void drawpoint_task(void * pdata); //无线接收任务#define WIRELESSRECEIVE_TASK_PRIO 5#define WIRELESSRECEIVE_STK_SIZE 64OS_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;//软件定时器1void * 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); //串口初始化为9600delay_init(72); //延时初始化 LCD_Init(); //初始化LCDmem_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); }}我想完成的功能是:在一个屏上画,能在另一个屏上也显示出来,结果触摸屏任务根本不进,导致无线发送任务,无线接收任务和画点任务只进一次就挂起了。然后就是不停地执行软件定时器任务。求指导啊,为什么啊?哪里出错了 |
|
相关推荐
9个回答
|
|
你只留下触摸屏任务试试。
|
|
|
|
还是进不去
|
|
|
|
而且不知道怎么回事,当我再次把全部任务开启之后,硬件调试的时候,除了软件定时器能进去,其他的也都进不去了,好郁闷
|
|
|
|
|
|
|
|
我就是在你的例程基础上改的。软件定时器的任务可以进去
|
|
|
|
我们的例程运行很正常哇。
|
|
|
|
我把我的代码下载到你的板子上,所有的任务都能运行,但是相同的代码在我的板子上就不行,而且有时候所有任务都不进,有时候只进画点任务和发送任务,接收任务和触摸屏任务都不进,这是怎么回事?cfg-h里的配置和你一模一样啊。忘记说了,我是用的VET6的主控,
|
|
|
|
那你先试试最简单的吧。比如任务调度那个例程,看看能跑起来不。
|
|
|
|
找到问题了,是VET6这款芯片对生成变量时,默认不是0
|
|
|
|
只有小组成员才能发言,加入小组>>
695 浏览 0 评论
1106 浏览 1 评论
2473 浏览 5 评论
2808 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2646 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
655浏览 9评论
651浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
783浏览 6评论
630浏览 5评论
670浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 19:28 , Processed in 0.967040 second(s), Total 62, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号