硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3160|回复: 7
收起左侧

[其它] 请教一个关于rtx的问题

[复制链接]

54

主题

145

回帖

307

积分

高级会员

积分
307
发表于 2016-5-23 15:53:07 | 显示全部楼层 |阅读模式
我用rtx和fatfs的时候开启多任务,经常出现死机的情况,我看安福莱的例子里也有好多没有使用多任务支持.



/*------------------------------------------------------------------------*/
/* Sample code of OS dependent controls for FatFs                         */
/* (C)ChaN, 2014                                                          */
/*------------------------------------------------------------------------*/

#include "ff.h"

#if _FS_REENTRANT
/*------------------------------------------------------------------------*/
/* Create a Synchronization Object
/*------------------------------------------------------------------------*/
/* This function is called in f_mount() function to create a new
/  synchronization object, such as semaphore and mutex. When a 0 is returned,
/  the f_mount() function fails with FR_INT_ERR.
*/
_SYNC_t fs_MUX;

int ff_cre_syncobj (    /* 1:Function succeeded, 0:Could not create the sync object */
    BYTE vol,            /* Corresponding volume (logical drive number) */
    _SYNC_t *sobj        /* Pointer to return the created sync object */
)
{
    int ret;


//    *sobj = CreateMutex(NULL, FALSE, NULL);        /* Win32 */
//    ret = (int)(*sobj != INVALID_HANDLE_VALUE);

//    *sobj = SyncObjects[vol];            /* uITRON (give a static sync object) */
//    ret = 1;                            /* The initial value of the semaphore must be 1. */

//    *sobj = OSMutexCreate(0, &err);        /* uC/OS-II */
//    ret = (int)(err == OS_NO_ERR);

//    *sobj = xSemaphoreCreateMutex();    /* FreeRTOS */
//    ret = (int)(*sobj != NULL);
   
    os_mut_init(sobj);                  
    ret = (int)(*sobj != 0);
    return ret;
}



/*------------------------------------------------------------------------*/
/* Delete a Synchronization Object                                        */
/*------------------------------------------------------------------------*/
/* This function is called in f_mount() function to delete a synchronization
/  object that created with ff_cre_syncobj() function. When a 0 is returned,
/  the f_mount() function fails with FR_INT_ERR.
*/

int ff_del_syncobj (    /* 1:Function succeeded, 0:Could not delete due to any error */
    _SYNC_t sobj        /* Sync object tied to the logical drive to be deleted */
)
{
    int ret;


//    ret = CloseHandle(sobj);    /* Win32 */

//    ret = 1;                    /* uITRON (nothing to do) */

//    OSMutexDel(sobj, OS_DEL_ALWAYS, &err);    /* uC/OS-II */
//    ret = (int)(err == OS_NO_ERR);

//  vSemaphoreDelete(sobj);        /* FreeRTOS */
//    ret = 1;

    sobj = 0;                  
    ret = 1;
    return ret;
}



/*------------------------------------------------------------------------*/
/* Request Grant to Access the Volume                                     */
/*------------------------------------------------------------------------*/
/* This function is called on entering file functions to lock the volume.
/  When a 0 is returned, the file function fails with FR_TIMEOUT.
*/

int ff_req_grant (    /* 1:Got a grant to access the volume, 0:Could not get a grant */
    _SYNC_t sobj    /* Sync object to wait */
)
{
    int ret;

//    ret = (int)(WaitForSingleObject(sobj, _FS_TIMEOUT) == WAIT_OBJECT_0);    /* Win32 */

//    ret = (int)(wai_sem(sobj) == E_OK);            /* uITRON */

//    OSMutexPend(sobj, _FS_TIMEOUT, &err));        /* uC/OS-II */
//    ret = (int)(err == OS_NO_ERR);

//    ret = (int)(xSemaphoreTake(sobj, _FS_TIMEOUT) == pdTRUE);    /* FreeRTOS */

    OS_RESULT result = os_mut_wait(sobj,_FS_TIMEOUT);
    if(result == OS_R_TMO)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}



/*------------------------------------------------------------------------*/
/* Release Grant to Access the Volume                                     */
/*------------------------------------------------------------------------*/
/* This function is called on leaving file functions to unlock the volume.
*/

void ff_rel_grant (
    _SYNC_t sobj    /* Sync object to be signaled */
)
{
//    ReleaseMutex(sobj);        /* Win32 */

//    sig_sem(sobj);            /* uITRON */

//    OSMutexPost(sobj);        /* uC/OS-II */

//    xSemaphoreGive(sobj);    /* FreeRTOS */
   
    os_mut_release(sobj);   
}

#endif




#if _USE_LFN == 3    /* LFN with a working buffer on the heap */
/*------------------------------------------------------------------------*/
/* Allocate a memory block                                                */
/*------------------------------------------------------------------------*/
/* If a NULL is returned, the file function fails with FR_NOT_ENOUGH_CORE.
*/

void* ff_memalloc (    /* Returns pointer to the allocated memory block */
    UINT msize        /* Number of bytes to allocate */
)
{
    return malloc(msize);    /* Allocate a new memory block with POSIX API */
}


/*------------------------------------------------------------------------*/
/* Free a memory block                                                    */
/*------------------------------------------------------------------------*/

void ff_memfree (
    void* mblock    /* Pointer to the memory block to free */
)
{
    free(mblock);    /* Discard the memory block with POSIX API */
}

#endif
回复

使用道具 举报

54

主题

145

回帖

307

积分

高级会员

积分
307
 楼主| 发表于 2016-5-23 15:54:02 | 显示全部楼层
我这么设计有问题吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107265
QQ
发表于 2016-5-23 16:00:19 | 显示全部楼层
RTX配套fatfs多不爽,上专业配套的FlashFS,用起来爽爽的 ,缺点是FlashFS文件名不支持中文。
回复

使用道具 举报

54

主题

145

回帖

307

积分

高级会员

积分
307
 楼主| 发表于 2016-5-24 09:46:04 | 显示全部楼层

回 eric2013 的帖子

eric2013:
RTX配套fatfs多不爽,上专业配套的FlashFS,用起来爽爽的 ,缺点是FlashFS文件名不支持中文。

我使用RL-flash出现这个问题,要怎么解决 QQ截图20160524094023.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107265
QQ
发表于 2016-5-24 10:57:02 | 显示全部楼层

回 mewan 的帖子

mewan:我使用RL-flash出现这个问题,要怎么解决 (2016-05-24 09:46) 
删掉MDK原有注册,使用这个帖子里面的第二个注册机:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=2346
回复

使用道具 举报

54

主题

145

回帖

307

积分

高级会员

积分
307
 楼主| 发表于 2016-5-24 11:21:11 | 显示全部楼层

回 eric2013 的帖子

eric2013:删掉MDK原有注册,使用这个帖子里面的第二个注册机:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=2346 (2016-05-24 10:57) 
使用rlflash怎么获取文件的大小啊?
回复

使用道具 举报

54

主题

145

回帖

307

积分

高级会员

积分
307
 楼主| 发表于 2016-5-24 14:08:18 | 显示全部楼层

回 mewan 的帖子

mewan:使用rlflash怎么获取文件的大小啊? (2016-05-24 11:21) 
使用rlflash后,用的是fs_cm3.lib替换fsn_cm3.lib后,但是还是不支持长文件名,还需要修改什么地方吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107265
QQ
发表于 2016-5-24 16:14:45 | 显示全部楼层

回 mewan 的帖子

mewan:使用rlflash后,用的是fs_cm3.lib替换fsn_cm3.lib后,但是还是不支持长文件名,还需要修改什么地方吗? (2016-05-24 14:08) 
例子:http://www.armbbs.cn/forum.php?mod=viewthread&tid=15790
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-23 22:34 , Processed in 0.283118 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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