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-01 22:45
我上次直接把完整的unicode和gbk的双向转换表放spi flash,反正空间大,这样查询时就很快了,像你那样做还得查找,虽然2分查找还是很快的
tabc_123
2楼-- · 2020-01-01 23:04
如要一次转换的数据量比较大时,总的转换时间要比较长,最好是一个转码只读一次FLASH是最好的。
ljt80158015
3楼-- · 2020-01-02 01:54
文件系统 存储也是在 外挂SPI FLASH SST25V016B中的吧?


这样的话 批量生产还是挺麻烦

一杯茶2009
4楼-- · 2020-01-02 04:15
myxiaonia 发表于 2016-7-21 23:51
我上次直接把完整的unicode和gbk的双向转换表放spi flash,反正空间大,这样查询时就很快了,像你那样做还 ...

不管存在哪都需要查表的,即使是存在内部FLASH中也一样。因为GBK和UNICODE码之间的对应关系不是线性的,必须要查表获取。
一杯茶2009
5楼-- · 2020-01-02 08:14
 精彩回答 2  元偷偷看……
一杯茶2009
6楼-- · 2020-01-02 08:14
ljt80158015 发表于 2016-7-22 14:53
文件系统 存储也是在 外挂SPI FLASH SST25V016B中的吧?

只有双向码表存在SPI FLASH中,可以把写码表到SPI FLASH中的代码单独生成HEX文件。使用文件系统前下载一次代码,上电运行一次即可。

一周热门 更多>