OpenEdv-开源电子网

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

ucos下的任务管理

[复制链接]

3

主题

17

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-4-27
在线时间
0 小时
发表于 2013-6-12 16:03:38 | 显示全部楼层 |阅读模式

我想建立一个向SD卡里面写数据的任务(这个任务随时可以运行,我在开始任务下)和个读SD里的TXT文件(这个任务在开始任务里面Task_Menu下的一个子任务,只有在运行到这个子任务的时候才可以运行)。但是这样的时候一旦运行到这个子任务就死机,我估计是运行到fatfs文件的时候调用重叠,导致死机。但是我加上OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()依然不行。还有打开TXT文件的时候会死在f_open上面。请各位大神指教啊。

附上程序

uCGUI+uCOS_V1.5.rar

6.23 MB, 下载次数: 253

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-12 17:05:05 | 显示全部楼层
回复【楼主位】e08680227:
---------------------------------
你把这个任务的fatfs部分屏蔽掉,看看还死机否?
另外,最好有jtag可以追踪下到底死在哪里.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

17

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-4-27
在线时间
0 小时
 楼主| 发表于 2013-6-12 18:12:34 | 显示全部楼层

  在写SD任务中去掉fatfs部分是可以正常工作的。
 两个任务同时运行时,它会由 OSTimeDly()延时函数进入错误中断,他需要循环20次左右进入死循环。
我修改 f_mount(1, fs)时他又可以读出SD卡TEXT文件下的txt菜单,但是依然打不开还是会在 OSTimeDly()进入死循环。
我每次重启时都会把TXT文件里面的数据冲掉,是否是这个函数 (f_mount)导致的,他每次都会重新记录


 

 

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-12 22:16:02 | 显示全部楼层
回复【3楼】e08680227:
---------------------------------
f_mount只需要调用一次就够了.一般死机也不会是这个函数的问题.
你的OSTimeDly后,进入错误的中断,表示很奇怪,进入什么错误的中断???
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

17

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-4-27
在线时间
0 小时
 楼主| 发表于 2013-6-13 10:15:29 | 显示全部楼层
       抱歉啊,描述错误,进入到硬件错误中断(HardFault_Handler)。
回复 支持 反对

使用道具 举报

3

主题

17

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-4-27
在线时间
0 小时
 楼主| 发表于 2013-6-13 10:27:35 | 显示全部楼层
我现在当进入读TXT文档时把任务挂起时,程序就可以正常运行,估计是临界区没掌握好吧
回复 支持 反对

使用道具 举报

3

主题

17

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-4-27
在线时间
0 小时
 楼主| 发表于 2013-6-13 11:05:03 | 显示全部楼层
我想把写SD卡的任务挂起,但是现在又恢复不了,退出这个时要用到OSTaskDel,我把恢复任务加在前面,OSTaskDel会进入硬件错误中断(HardFault_Handler),加在后面有运行不到,求指点啊。
下面是运行任务的代码
初始菜单:
void Task_Menu(void *pdata)
{
  GUI_Init();
  MainMenu_Init();
while(1) {
if(TouchCmd == 1 && Menu_ID == MainMenu_ID){
TouchCmd = 0;
  switch(GUI_GetKey()) {

  case GUI_ID_BUTTON0:
    GUI_MessageBox("Function does not support!","GUI MessageBox0",GUI_MESSAGEBOX_CF_MOVEABLE);
  break;
  case GUI_ID_BUTTON1: //退出主界面并创建文件浏览任务
          Out_MainMenu();
       //GUI_SetColor(GUI_BLACK);//
 //GUI_MessageBox("Function does not support!","GUI MessageBox1",GUI_MESSAGEBOX_CF_MOVEABLE);
  OSTaskCreate(Task_FileBrowser, (void * )0, (OS_STK *)&TASK_FileBrowser_STK[FileBrowser_STK_SIZE-1], FileBrowser_TASK_Prio);
  break;
  case GUI_ID_BUTTON2:
        OSTaskSuspend(ADPut_STK_Prio);//任务挂起
  OSTaskCreate(Task_TextBrowser, (void * )0, (OS_STK *)&TASK_TextBrowser_STK[TextBrowser_STK_SIZE-1], TextBrowser_TASK_Prio);
  // OSTaskResume(ADPut_STK_Prio);//运行任务
  break;
  case GUI_ID_BUTTON3: //退出主界面并创建设置任务
 Out_MainMenu();
//WM_SetDesktopColor(GUI_BLACK);
  //GUI_SetColor(GUI_BLACK);
 Out_MainMenu();
  OSTaskCreate(Task_Setting, (void * )0, (OS_STK *)&TASK_Setting_STK[Setting_STK_SIZE-1], Setting_TASK_Prio);
  break;
  case GUI_ID_BUTTON4:
Out_MainMenu();
  OSTaskCreate(Task_ADC, (void * )0, (OS_STK *)&TASK_ADC_STK[ADC_STK_SIZE-1], ADC_TASK_Prio);
  break;
default:
TouchCmd = 1;
break;
  }
  }
  WM_MoveCtrl();
GUI_Exec();//重绘
  OSTimeDly(3);
}
}

读txt文件任务:
void Task_TextBrowser(void *pdata)
{
WM_HWIN hWM;
OS_CPU_SR  cpu_sr;
u16 br = 0;

u16 File_Buffer[32];
   
GUI_CreateDialogBox(TextBrowseDialog, GUI_COUNTOF(TextBrowseDialog), TextBrowseCallBack, 0, 0, 0);
//建立一个非阻塞式的对话框,0(表示没有父窗口),0(x),0(y)
//TextBrowseDialog(定义包含在对话框中所有控件的资源表的指针)
//GUI_COUNTOF(包含在对话框中所有控件的数量)
//TextBrowseCallBack(回调函数的指针)
Exit_Browser = 0;
/*******************************************************************************************************/
while(1){

if(TouchCmd == 1){
TouchCmd = 0;
  }
if(Exit_Browser == Back){
Exit_Browser = 0;
    GUI_CreateDialogBox(TextBrowseDialog, GUI_COUNTOF(TextBrowseDialog), TextBrowseCallBack, 0, 0, 0);
//建立一个非阻塞式的对话框
}
if(Exit_Browser == Exit){//按文件浏览的exit的按钮,退出进入主界面
WM_SetDesktopColor(DesktopColor);//设置背景颜色
  Go_MainMenu();              //进入主界面

OSTaskDel(OS_PRIO_SELF);    //删除自己
      //OSTaskResume(ADCMenu_STK_Prio);//运行任务
    OSTaskResume(ADPut_STK_Prio);//运行任务

else if(Exit_Browser == OpenFile) {//打开文档
Exit_Browser = 0;
OS_ENTER_CRITICAL(); //宏,进入临阶段
f_open(&f_file,(const TCHAR*)buf1,FA_READ);//打开文件
f_read(&f_file,File_Buffer,1020,(UINT*)&br);
f_close(&f_file);//关闭文件 
OS_EXIT_CRITICAL();//宏,退出临界段(开中断) 
buf1[30] = 0;
  WM_SetDesktopColor(DesktopColor);//设置背景颜色
GUI_Exec();//重绘
hWM = GUI_CreateDialogBox(TextViewDialog, GUI_COUNTOF(TextViewDialog), TextViewCallBack, 0, 0, 0);
//建立一个对话框
MULTIEDIT_SetText(WM_GetDialogItem(hWM,GUI_ID_MULTIEDIT0), (const char*)File_Buffer);
//WM_GetDialogItem返回一个对话框项目(控件)的窗口句柄
//设置MultiEdit的显示文本,MULTIEDIT,可以多行输入
}

  OSTimeDly(10); //保证50Hz的执行频率
}

}
回复 支持 反对

使用道具 举报

3

主题

17

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-4-27
在线时间
0 小时
 楼主| 发表于 2013-6-13 11:06:29 | 显示全部楼层

if(Exit_Browser == Exit){//按文件浏览的exit的按钮,退出进入主界面
WM_SetDesktopColor(DesktopColor);//设置背景颜色
  Go_MainMenu();              //进入主界面

OSTaskDel(OS_PRIO_SELF);    //删除自己
      //OSTaskResume(ADCMenu_STK_Prio);//运行任务
    OSTaskResume(ADPut_STK_Prio);//运行任务

这里是退出的按钮运行的任务

回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-18 19:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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