FATFS中文码表转移至SPI FLASH,解决占用ROM问题

2020-01-01 17:54发布

本帖最后由 一杯茶2009 于 2016-7-21 21:03 编辑

采用的是FATFS 0.09,硬件STM32F103,虽然FLASH有512K,但是增加文件系统支持添加CC936.C后,占用空间还是相当恐怖的。
随后想着把CC936.C码表转移至外挂SPI FLASH SST25V016B中节省ROM空间。当然也需要改写转换函数。贴出来和大家分享一下。



#define CODE_UtoG_BASE (64*1024*14)     //unicode转GBK基地址
#define CODE_GtoU_BASE (64*1024*16)   //GBK转unicode基地址

#if !_USE_LFN || _CODE_PAGE != 936
#error This file is not needed in current configuration. Remove from the project.
#endif

WCHAR ff_convert (        /* Converted code, 0 means conversion error */
        WCHAR        src,        /* Character code to be converted */
        UINT        dir                /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */
)
{

        unsigned int p=0;
        WCHAR c,temp;
        int i, n, li, hi;
        unsigned int oem2uni=87172,uni2oem=87172;//码表占用字节大小
        unsigned char buff[2];
       
        if (src < 0x80) {        /* ASCII */
                c = src;
        } else {
                if (dir) {                /* OEMCP to unicode */
                        p = CODE_GtoU_BASE;
                        hi = oem2uni / 4 - 1;
                } else {                /* Unicode to OEMCP */
                        p = CODE_UtoG_BASE;
                        hi = uni2oem / 4 - 1;
                }
                li = 0;
                for (n = 16; n; n--){    //2分法查表
                        i = li + (hi - li) / 2;
                       
                        SST25V_BufferRead(p + i*4, buff, 2);
                       
                        temp = (buff[0]<<8)+buff[1];

                        if (src == temp ) break;

                  if (src > temp)
                                li = i;
                        else
                                hi = i;
                }
                SST25V_BufferRead(p + (i*4+2), buff, 2);
                temp = (buff[0]<<8)+buff[1];

                c = n ? temp : 0;
        }

        return c;
}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
myxiaonia
1楼-- · 2020-01-02 11:41
一杯茶2009 发表于 2016-7-22 19:08
因为要查表获取对应原始码的偏移,所以不可避免的要多次查表。
你有什么能解决这个问题的好方法吗?还望 ...

你知道为何这里用2分查找吗?是因为这个查找表是不完整的,完整的话是2个64k对64k,共256k呢
redroof
2楼-- · 2020-01-02 12:17
myxiaonia 发表于 2016-7-23 08:00
你知道为何这里用2分查找吗?是因为这个查找表是不完整的,完整的话是2个64k对64k,共256k呢 ...

256K对两兆的外部flash不算什么啊。干吗不直接用完整的表格,这样一次读取就够了
一杯茶2009
3楼-- · 2020-01-02 17:29
myxiaonia 发表于 2016-7-23 08:00
你知道为何这里用2分查找吗?是因为这个查找表是不完整的,完整的话是2个64k对64k,共256k呢 ...

受教了,感谢!
一杯茶2009
4楼-- · 2020-01-02 20:36
 精彩回答 2  元偷偷看……
菜包
5楼-- · 2020-01-03 00:33
myxiaonia 发表于 2016-7-23 08:00
你知道为何这里用2分查找吗?是因为这个查找表是不完整的,完整的话是2个64k对64k,共256k呢 ...

能分享一下完整的转换表格吗,可以直接烧到Flash的bin文件,谢谢

一周热门 更多>