搜索
bottom↓
回复: 22

关于UCOS,UCGUI,FATFS综合在一起总是出错,求解

[复制链接]

出0入0汤圆

发表于 2013-7-14 20:02:27 | 显示全部楼层 |阅读模式
单独测试UCOS,UCGUI,UCOS&UCGUI,FATFS都没有问题,但是把三者结合在一起就出问题了,总是出BUG,仿真显示每次程序都会到HardFault_Handler这个地方。
问了学长,学长说这是UCOS不断的近栈出栈导致和FATFS文件系统过多的参数导致的数据溢出,这个我真心不知道应该怎么解决,学长给的建议就是在主函数里面使用FATFS(事实证明确实可以),可是这样的话就不能使用UCOS创建一两个任务来调用FATFSde一些函数了,自从认识了UCOS,总觉得基于系统的编程要好一点,当然缺点也有,就是找BUG的时候又多了一点原因。
有尝试过把startup_stm32f4xx.s里面的
Stack_Size      EQU     0x00000400
改大,但是效果不是很明显,有没有一些同学遇到过的?能给点建议么?你们都是怎么在UCOS所创建的N个任务里面去调用FATFS的一些函数啊????

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2013-7-14 20:23:04 | 显示全部楼层
把你的每个任务的堆栈改大点试下!

出0入0汤圆

 楼主| 发表于 2013-7-14 20:37:37 | 显示全部楼层
electrlife 发表于 2013-7-14 20:23
把你的每个任务的堆栈改大点试下!

都改到1000多了,还是不行

出0入0汤圆

发表于 2013-7-14 20:45:01 来自手机 | 显示全部楼层
改为静态变量咯

出0入0汤圆

 楼主| 发表于 2013-7-14 20:49:09 | 显示全部楼层
valley 发表于 2013-7-14 20:45
改为静态变量咯

什么意思啊?我没明白,能说的详细一点么》

出0入0汤圆

发表于 2013-7-14 22:01:05 | 显示全部楼层
UCOS环境下也是像往常一样调用,不过建议开启FATFS的可重入!

出0入0汤圆

发表于 2013-7-14 22:21:20 | 显示全部楼层
enterpriseZ 发表于 2013-7-14 20:37
都改到1000多了,还是不行

首先,应当先确认是否是精确的可定位异常,
如果是找到异常的原因,异常的函数,异常的指令。

以下是我的异常处理函数,汇编部分是IAR,你可以参考下改为MDK,以方便定位异常:

        PUBWEAK HardFault_Handler
        SECTION .text:CODE:REORDER(1)
HardFault_Handler
        TST     LR, #0x4    ; EXC_RETURN.2=0?
        ITE     EQ          ; 如是为零,则
        MRSEQ   R0, MSP     ; 把MSP加载入R0中
        MRSNE   R0, PSP     ; 否则, 就把PSP加载入R0中
        B       HardFault_Handler_C
        
        PUBWEAK HardFault_Handler_C
        SECTION .text:CODE:REORDER(1)
HardFault_Handler_C
        B       HardFault_Handler_C

void HardFault_Handler_C(uint32_t *xsp);
void HardFault_Handler_C(uint32_t *xsp)
{
    volatile uint32_t stacked_r0;
    volatile uint32_t stacked_r1;
    volatile uint32_t stacked_r2;
    volatile uint32_t stacked_r3;
    volatile uint32_t stacked_r12;
    volatile uint32_t stacked_lr;
    volatile uint32_t stacked_pc;
    volatile uint32_t stacked_psr;

    stacked_r0  = ((uint32_t) xsp[0]);
    stacked_r1  = ((uint32_t) xsp[1]);
    stacked_r2  = ((uint32_t) xsp[2]);
    stacked_r3  = ((uint32_t) xsp[3]);

    stacked_r12 = ((uint32_t) xsp[4]);
    stacked_lr  = ((uint32_t) xsp[5]);
    stacked_pc  = ((uint32_t) xsp[6]);
    stacked_psr = ((uint32_t) xsp[7]);

    while (1);
}

出0入0汤圆

 楼主| 发表于 2013-7-15 08:10:24 | 显示全部楼层
nideai3344 发表于 2013-7-14 22:01
UCOS环境下也是像往常一样调用,不过建议开启FATFS的可重入!

啥意思啊??

出0入0汤圆

发表于 2013-7-15 10:20:31 | 显示全部楼层
enterpriseZ 发表于 2013-7-15 08:10
啥意思啊??

FATFS已经在底层做好了在RTOS下移植的工作----创建互斥信息量,防止在不同任务间同时访问文件系统函数而出现错误!具体要在ffconf.h里面修改这几个宏(基于R0.09a版本):
#define     _FS_REENTRANT  1                /* 是否配置为可重入  0:Disable or 1:Enable */       
#define     _FS_TIMEOUT  1000                /* 等待信息量时限 Timeout period in unit of time ticks */
#define        _SYNC_t  OS_EVENT*               /* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */
#define        _FS_LOCK  2                       /* 是否支持文件共享 0:Disable or >=1:Enable */ 在R0.09a版本版本之前是叫_FS_SHARE
除此之外,还需要加上跟操作系统信号量相关的几个函数,函数在syscall.c 文件中。

出0入0汤圆

 楼主| 发表于 2013-7-15 14:30:35 | 显示全部楼层
nideai3344 发表于 2013-7-15 10:20
FATFS已经在底层做好了在RTOS下移植的工作----创建互斥信息量,防止在不同任务间同时访问文件系统函数而 ...

请问一下这个syscall.c文件是什么东东啊

出0入0汤圆

发表于 2013-7-15 16:23:44 | 显示全部楼层
enterpriseZ 发表于 2013-7-15 14:30
请问一下这个syscall.c文件是什么东东啊

包含互斥信号量相关的几个函数,在你的FATFS根目录\src\option文件夹中!

出0入0汤圆

 楼主| 发表于 2013-7-15 17:35:19 | 显示全部楼层
nideai3344 发表于 2013-7-15 16:23
包含互斥信号量相关的几个函数,在你的FATFS根目录\src\option文件夹中!

我确实找到了那个文件,也尝试过更改,但是组建工程的时候总是不成功,能给个示例的看一下么?
或者说具体的应该怎么弄呢???

出0入0汤圆

发表于 2013-7-15 17:53:18 | 显示全部楼层
enterpriseZ 发表于 2013-7-15 17:35
我确实找到了那个文件,也尝试过更改,但是组建工程的时候总是不成功,能给个示例的看一下么?
或者说具 ...

之前的宏有更改的话,这是syscall.c里的内容,已更改过。
  1. #include <stdlib.h>                /* ANSI memory controls */
  2. #include "../ff.h"

  3. #if _FS_REENTRANT

  4. /* This function is called in f_mount function to create a new
  5. /  synchronization object, such as semaphore and mutex. When a zero is
  6. /  returned, the f_mount function fails with FR_INT_ERR.
  7. */
  8. int ff_cre_syncobj (        /* TRUE:Function succeeded, FALSE:Could not create due to any error */
  9.         BYTE vol,                        /* Corresponding logical drive being processed */
  10.         _SYNC_t *sobj                /* Pointer to return the created sync object */
  11. )
  12. {
  13.         int ret;
  14.         u8 err;
  15.        
  16.         *sobj = OSMutexCreate(0, &err);                        /* uC/OS-II */
  17.         ret = (err == OS_ERR_NONE);
  18.        
  19.         return ret;
  20. }

  21. /*------------------------------------------------------------------------*/
  22. /* Delete a Synchronization Object                           */
  23. /*------------------------------------------------------------------------*/
  24. /* This function is called in f_mount function to delete a synchronization
  25. /  object that created with ff_cre_syncobj function. When a zero is
  26. /  returned, the f_mount function fails with FR_INT_ERR.
  27. */
  28. int ff_del_syncobj (        /* TRUE:Function succeeded, FALSE:Could not delete due to any error */
  29.         _SYNC_t sobj                /* Sync object tied to the logical drive to be deleted */
  30. )
  31. {
  32.         int ret;
  33.         u8 err;
  34.        
  35.         OSMutexDel(sobj, OS_DEL_ALWAYS, &err);        /* uC/OS-II */
  36.         ret = (err == OS_ERR_NONE);

  37.         return ret;
  38. }

  39. /*------------------------------------------------------------------------*/
  40. /* Request Grant to Access the Volume                    */
  41. /*------------------------------------------------------------------------*/
  42. /* This function is called on entering file functions to lock the volume.
  43. /  When a zero is returned, the file function fails with FR_TIMEOUT.
  44. */
  45. int ff_req_grant (        /* TRUE:Got a grant to access the volume, FALSE:Could not get a grant */
  46.         _SYNC_t sobj        /* Sync object to wait */
  47. )
  48. {
  49.         int ret;
  50.         u8 err;
  51.        
  52.         OSMutexPend(sobj, _FS_TIMEOUT, &err);                        /* uC/OS-II */
  53.         ret = (err == OS_ERR_NONE);

  54.         return ret;
  55. }

  56. /*------------------------------------------------------------------------*/
  57. /* Release Grant to Access the Volume                     */
  58. /*------------------------------------------------------------------------*/
  59. /* This function is called on leaving file functions to unlock the volume.
  60. */
  61. void ff_rel_grant (
  62.         _SYNC_t sobj        /* Sync object to be signaled */
  63. )
  64. {
  65.         OSMutexPost(sobj);                /* uC/OS-II */
  66. }

  67. #endif
复制代码

出0入0汤圆

 楼主| 发表于 2013-7-15 21:00:48 | 显示全部楼层
nideai3344 发表于 2013-7-15 17:53
之前的宏有更改的话,这是syscall.c里的内容,已更改过。

您好,这个我按照您的示例改了,可是有很多错误啊……
付个截图吧
这是我的工程…………

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-7-15 22:52:29 | 显示全部楼层
本帖最后由 nideai3344 于 2013-7-15 22:53 编辑
enterpriseZ 发表于 2013-7-15 21:00
您好,这个我按照您的示例改了,可是有很多错误啊……
付个截图吧
这是我的工程…………


首先你的OS没有使能互斥信息量:

其次你的头文件这边多了点东西:


这两处改完就OK了,修改后的工程:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-7-16 08:08:08 | 显示全部楼层
nideai3344 发表于 2013-7-15 22:52
首先你的OS没有使能互斥信息量:

其次你的头文件这边多了点东西:

行,我先看看,先谢谢吧……

出0入0汤圆

发表于 2015-3-6 09:40:53 | 显示全部楼层
最后的问题怎么解决的?大神,我也碰到 了。
就是在main函数里面一切正常,在任务里面就出问题。单任务测试代码也不行

出0入0汤圆

发表于 2015-3-6 09:44:34 | 显示全部楼层
enterpriseZ 发表于 2013-7-16 08:08
行,我先看看,先谢谢吧……

能加个好友么?

出0入0汤圆

发表于 2015-5-22 15:50:35 | 显示全部楼层
nideai3344 发表于 2013-7-15 22:52
首先你的OS没有使能互斥信息量:

其次你的头文件这边多了点东西:

这个问题我也遇到了,谢谢你的帖子。

出0入0汤圆

发表于 2017-10-19 12:08:31 | 显示全部楼层
mark!!!!!!!!!!!!!!!!!

出0入0汤圆

发表于 2017-10-19 16:29:55 | 显示全部楼层
增大调用FATFS任务堆栈,或者把FATFS一些变量改为全局变量或添加static。

出0入0汤圆

发表于 2017-10-25 09:31:14 | 显示全部楼层
654705188 发表于 2017-10-19 16:29
增大调用FATFS任务堆栈,或者把FATFS一些变量改为全局变量或添加static。

能具体说说嘛?那些变量呢?

出0入0汤圆

发表于 2017-11-2 08:46:38 | 显示全部楼层
撞线 发表于 2017-10-25 09:31
能具体说说嘛?那些变量呢?

把FATFS中使用到的大数组或者大结构体改变全局变量或者再前边加上static修饰。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 21:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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