[mw_shl_code=c,true]
/////////////////////////UCOSII任务堆栈设置///////////////////////////////////
//START 任务
//设置任务优先级
#define START_TASK_PRIO 0
//设置任务堆栈大小
#define START_STK_SIZE 128
//创建任务堆栈空间
OS_STK START_TASK_STK[START_STK_SIZE];
//任务函数接口
void start_task(void *pdata);
//LED任务
//设置任务优先级
#define LED_TASK_PRIO 7
//设置任务堆栈大小
#define LED_STK_SIZE 64
//创建任务堆栈空间
OS_STK LED_TASK_STK[LED_STK_SIZE];
//任务函数接口
void led_task(void *pdata);
//TOUCH任务
//设置任务优先级
#define TOUCH_TASK_PRIO 2
//任务堆栈大小
#define TOUCH_STK_SIZE 128
//任务堆栈
OS_STK TOUCH_TASK_STK[TOUCH_STK_SIZE];
//touch任务
void touch_task(void *pdata);
//按键扫描任务
//设置任务优先级
#define KEY_TASK_PRIO 6
//设置任务堆栈大小
#define KEY_STK_SIZE 256
//创建任务堆栈空间
OS_STK KEY_TASK_STK[KEY_STK_SIZE];
//任务函数接口
void key_task(void *pdata);
u8 res;
FIL* f_txt = 0;
DIR textdir;
u32 NumWritten = 0;
int main(void)
{
delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600);
LED_Init(); //初始化与LED连接的硬件接口
BEEP_Init(); //蜂鸣器初始化
KEY_Init(); //按键初始化
TFTLCD_Init();
TP_Init();
FSMC_SRAM_Init(); //初始化SRAM
mem_init(SRAMIN); //初始化内部内存池
mem_init(SRAMEX);
exfuns_init(); //为fatfs相关变量申请内存
f_mount(0,fs[0]); //挂载SD卡
f_mount(1,fs[1]); //挂载FLASH.
font_init();//字库、SPI初始化
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);//GUI开crc时钟
GUI_Init();//初始化GUI 用到了UCOS和内存管理,初始化函数必须在内存管理初始化之后
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;
pdata = pdata;
LCD_Clear(LIGHTBLUE);
GUI_DrawGradientV(0,0,320,480,GUI_LIGHTBLUE,GUI_WHITE);
POINT_COLOR=BLACK;
BACK_COLOR = LIGHTBLUE;
LCD_ShowString(60,50,200,16,16,"STM32 UCOS");
LCD_ShowString(60,70,200,16,16,"FATFS TEST");
Show_Str(60,90,200,16,"中文字库显示",16,0);
OSStatInit(); //初始化统计任务.这里会延时1秒钟左右
OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)
OSTaskCreate(touch_task,(void*)0,(OS_STK*)&TOUCH_TASK_STK[TOUCH_STK_SIZE-1],TOUCH_TASK_PRIO); //触摸屏任务
OSTaskCreate(led_task,(void *)0,(OS_STK*)&LED_TASK_STK[LED_STK_SIZE-1],LED_TASK_PRIO);
OSTaskCreate(key_task,(void *)0,(OS_STK*)&KEY_TASK_STK[KEY_STK_SIZE-1],KEY_TASK_PRIO);
OSTaskSuspend(START_TASK_PRIO); //挂起起始任务.
OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)
}
//LED任务
void led_task(void *pdata)
{
while(1)
{
//LED0=!LED0;
LED1=!LED1;
delay_ms(500);
}
}
//按键扫描任务
void key_task(void *pdata)
{
u8 key;
// OS_CPU_SR cpu_sr=0;
//GUI_CURSOR_Show();
//GUI_SetTextMode(GUI_TM_TRANS|GUI_TM_REV); //透明显示
GUI_DispStringAt("STemWin Test...",60,0);
res = f_opendir(&textdir,(const TCHAR*)"0:/TEXT");
res = f_chdir ("0:/TEXT");
f_txt=(FIL *)mymalloc(SRAMIN,(sizeof(FIL))); //开辟FIL字节的内存区域
while(1)
{
key=KEY_Scan(0);
if(key==KEY_RIGHT)
{
OSTaskSuspend(LED_TASK_PRIO);//挂起LED任务,LED停止闪烁
}
else if (key==KEY_LEFT)
{
OSTaskResume(LED_TASK_PRIO); //恢复LED任务,LED恢复闪烁
}
else if (key==KEY_DOWN)
{
//OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)
res = f_open (f_txt, "文件系统FAT_test.txt", FA_READ|FA_WRITE);
if(res == FR_OK)
{
f_lseek (f_txt, f_size(f_txt));
res = f_write (f_txt, "\r\nfatfs test中文测试", 20, &NumWritten);
}
else
{
res = f_open (f_txt, "文件系统FAT_test.txt", FA_CREATE_NEW|FA_READ|FA_WRITE);
res = f_write (f_txt, "Fatfs test中文测试", 20, &NumWritten);
}
res = f_close (f_txt);
//OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)
LCD_ShowString(60,190,200,16,16,"Fatfs write test ");
}
delay_ms(10);
}
}
void touch_task(void *pdata)
{
while(1)
{
GUI_TOUCH_Exec();
OSTimeDlyHMSM(0,0,0,5);//延时5ms
}
}
[/mw_shl_code]
主函数文件就以上东西,奇怪的是如果我把key_task里面的
//GUI_CURSOR_Show();
//GUI_SetTextMode(GUI_TM_TRANS|GUI_TM_REV); //透明显示
注掉后下载可以运行,但是debug会进hardfault,初始化统计任务就进hardfault,如果注释放开就无法运行,debug也进hardfault
求大神指点可能会是什么地方出错了? |