cnCalc计算器论坛

 找回密码
 注册
搜索
查看: 6496|回复: 19

[fx-9860/9750] 9860sdk里关于内外存读取的问题

[复制链接]
发表于 2012-8-11 19:37:36 | 显示全部楼层 |阅读模式
(写的有点凌乱O.o)
广告上说9860有8kb的(叫什么忘了,核心?)memory
变量肯定是在内存里的,var只能开8kb,还是4kb我忘了
可是我开const可以开到1gbj_0012.gif
那么const是在哪里呢?
访问const里的数据会不会比变量慢呢?
能不能直接一个指针过去强行将const当变量用呢?那么就爽了j_0003.gif

小饕的中文字库是在storage mem上的,显示读起来是有点慢
但是const呢?
我在写魔塔是图片是放在const上的,电脑上测试的时候不慢,但放到计算器上是就慢了
同样,中文显示在电脑上是立即的,但在计算器上要等一段时间
于是得到两个推论:
1)电脑模拟器没有考虑读取的速度,只模拟了cpu
2)const和storage是在一起的,那么就慢了

但是还有一点不同意见:
程序代码也可以写到8kb以上,那么程序放哪儿呢?如果放在比较慢的介质上,这显然不明智
还有堆栈?
而且const也没有storage慢的那么厉害,毕竟好多人都在用这种方法

我们的目的就是:更大、更快的内存!
有传言说内外存都在flash上,(还有人说flash上有一大块未开发领域)
希望得知9860数据存放的地方和方式


希望大家一起研究!

我有几个建议:
1)用\x看看var,const甚至函数的地址,如果有大牛还可以研究内存地图(就是金山游侠之类的方法)
2)sdk编译时生成了几个文件,我看了下,上面有内存分配、程序编译等等天机,可惜我基础不牢~
3)外国网站和casio官方

评分

参与人数 2金钱 +14 收起 理由
zhs490770 + 10 欢迎探讨
diameter + 4 欢迎探讨

查看全部评分

发表于 2012-8-11 20:45:25 | 显示全部楼层
本帖最后由 diameter 于 2012-8-11 20:50 编辑

1# GWHBOB

开const能开到1g!!!!不能啊,下面这段代码就不能通过编译

  1. typedef unsigned char byte;
  2. const byte test_data[1024*8]; /* 全局变量哦 */
复制代码
错误信息是The size of B and R section should be 0x2000 bytes or less.
说明全局变量(在静态区)大小不能超过0x2000(dec:8192)byte

但是在栈上(比如函数里),和堆上(用malloc,calloc分配)就不存在这个问题了
(我手上没机器没法测试)
发表于 2012-8-11 20:54:37 | 显示全部楼层
下面的代码编译出来996字节

  1. #include <fxlib.h>
  2. typedef unsigned int uint;
  3. typedef unsigned char byte;
  4. const byte test_data[8000];

  5. int AddIn_main(int isAppli, unsigned short OptionNum)
  6. {
  7. byte a[0x2000+1];
  8. uint key;
  9. Bdisp_AllClr_DDVRAM();
  10. while (1);
  11. {
  12.   GetKey(&key);
  13. }
  14. return 1;
  15. }
  16. /* 后面繁琐的#pragma预处理省略 */
复制代码



const byte test_data[8000];
改成
const byte test_data[8000]={0};
再编译立马成9kb了!是不是神奇...
发表于 2012-8-11 20:58:44 | 显示全部楼层
LZ应该见过最新的道路之星吧,它已经达到190多k了..我怀疑它就是把汉字库打包进了里面。
我没记错的话hzk是可以压缩的(ccdos里面就有),仙剑里面的字体文件(应该是16*16的)居然才60多k,没天理啊..

我们能不能找到将文件装入addin的途径?
发表于 2012-8-11 21:16:32 | 显示全部楼层
本帖最后由 diameter 于 2012-8-11 21:20 编辑

我在工程的debug文件夹下翻到了lst文件,里面居然全是汇编!就是每个.c源文件的汇编代码。
这个发现可能会有用。关于sh的汇编参加wudy发过的帖子http://www.cncalc.org/viewthread.php?tid=7016
  1. SH SERIES C/C++ Compiler (Ver. 6.0C)                                                                 11-Aug-2012 20:52:33  PAGE    1

  2. ************ OBJECT LISTING ************

  3. FILE NAME: E:\techtst\techtst.c

  4. SCT OFFSET   CODE       C LABEL     INSTRUCTION OPERAND    COMMENT

  5.        techtst.c     1    #include <fxlib.h>
  6.        techtst.c     2   
  7.        techtst.c     3    typedef unsigned int uint;
  8.        techtst.c     4   
  9.        techtst.c     5    typedef unsigned char byte;
  10.        techtst.c     6   
  11.        techtst.c     7    const byte test_data[8000]={0};
  12.        techtst.c     8   
  13.        techtst.c     9   
  14.        techtst.c    10    int AddIn_main(int isAppli, unsigned short OptionNum)
  15. P   00000000              _AddIn_main:                     ; function: AddIn_main
  16.                                                            ; frame size=8200
  17.     00000000 9005                   MOV.W       L314,R0    ; H'DFF8
  18.     00000002 3F0C                   ADD         R0,R15
  19.        techtst.c    11    {
  20.        techtst.c    12            byte a[0x2000+1];
  21.        techtst.c    13            uint key;
  22.        techtst.c    14            Bdisp_AllClr_DDVRAM();
  23.     00000004 D302                   MOV.L       L314+2,R3  ; _Bdisp_AllClr_DDVRAM
  24.     00000006 430B                   JSR         @R3
  25.     00000008 0009                   NOP
  26.        techtst.c    15            while (1);
  27.     0000000A              L310:                             
  28.     0000000A AFFE                   BRA         L310
  29.     0000000C 0009                   NOP
  30.     0000000E              L314:                             
  31.     0000000E DFF8                   .DATA.W     H'DFF8
  32.     00000010 <00000000>             .DATA.L     _Bdisp_AllClr_DDVRAM
  33.        techtst.c    16            {
  34.        techtst.c    17                    GetKey(&key);
  35.        techtst.c    18            }
  36.        techtst.c    19            return 1;
  37.        techtst.c    20    }
  38.        techtst.c    21   
  39.        techtst.c    22   
  40.        techtst.c    23   
  41.        techtst.c    24   
  42.        techtst.c    25   
  43.        techtst.c    26    #pragma section _BR_Size
  44.        techtst.c    27    unsigned long BR_Size;
  45.        techtst.c    28    #pragma section
  46.        techtst.c    29   
  47.        techtst.c    30   
  48.        techtst.c    31    #pragma section _TOP
  49.        techtst.c    32   
  50.        techtst.c    33    int InitializeSystem(int isAppli, unsigned short OptionNum)
  51. P_T 00000000              _InitializeSystem:               ; function: InitializeSystem
  52.                                                            ; frame size=0
  53.        techtst.c    34    {
  54.        techtst.c    35        return INIT_ADDIN_APPLICATION(isAppli, OptionNum);
  55.     00000000 D301                   MOV.L       L315+2,R3  ; _INIT_ADDIN_APPLICATION
  56.     00000002 432B                   JMP         @R3
  57.     00000004 0009                   NOP
  58.     00000006              L315:                             




  59. SH SERIES C/C++ Compiler (Ver. 6.0C)                                                                 11-Aug-2012 20:52:33  PAGE    2


  60. SCT OFFSET   CODE       C LABEL     INSTRUCTION OPERAND    COMMENT

  61.     00000006 0000                   .DATA.W     0
  62.     00000008 <00000000>             .DATA.L     _INIT_ADDIN_APPLICATION
  63.        techtst.c    36    }
  64.        techtst.c    37   
  65.        techtst.c    38    #pragma section
  66.        techtst.c    39   
  67. C   00000000              _test_data:                      ; static: test_data
  68.     00000000 00                     .DATA.B     H'00
  69.     00000001 00001F3F01             .DATAB.B    7999,0
  70.              00           
  71. B_B 00000000              _BR_Size:                        ; static: BR_Size
  72.     00000000 00000004               .RES.L      1

  73. SH SERIES C/C++ Compiler (Ver. 6.0C)                                                                 11-Aug-2012 20:52:33  PAGE    1


  74. ******** STATISTICS INFORMATION ********


  75. ********** ERROR INFORMATION ***********

  76. NUMBER OF ERRORS:           0
  77. NUMBER OF WARNINGS:         0




  78. ******* SOURCE LINE INFORMATION ********

  79. COMPILED SOURCE LINE:       39



  80. ******* SECTION SIZE INFORMATION *******

  81. PROGRAM  SECTION (P):                               00000014 Byte(s)
  82. PROGRAM  SECTION (P_BR_Size):                       00000000 Byte(s)
  83. PROGRAM  SECTION (P_TOP):                           0000000C Byte(s)
  84. CONSTANT SECTION (C):                               00001F40 Byte(s)
  85. CONSTANT SECTION (C_BR_Size):                       00000000 Byte(s)
  86. CONSTANT SECTION (C_TOP):                           00000000 Byte(s)
  87. DATA     SECTION (D):                               00000000 Byte(s)
  88. DATA     SECTION (D_BR_Size):                       00000000 Byte(s)
  89. DATA     SECTION (D_TOP):                           00000000 Byte(s)
  90. BSS      SECTION (B):                               00000000 Byte(s)
  91. BSS      SECTION (B_BR_Size):                       00000004 Byte(s)
  92. BSS      SECTION (B_TOP):                           00000000 Byte(s)

  93. TOTAL PROGRAM SIZE: 00001F64 Byte(s)



  94. ********** LABEL INFORMATION ***********

  95. NUMBER OF EXTERNAL REFERENCE SYMBOLS:            3
  96. NUMBER OF EXTERNAL DEFINITION SYMBOLS:           4
  97. NUMBER OF INTERNAL/EXTERNAL SYMBOLS:            10


  98. *** COMMAND PARAMETER ***


  99.   -subcommand=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\hmkC0.tmp
复制代码

评分

参与人数 1金钱 +2 收起 理由
GWHBOB + 2 早发现了~看看The size of B and R section ...

查看全部评分

 楼主| 发表于 2012-8-11 21:52:16 | 显示全部楼层
2# diameter
好吧你对的,只是没想到8k可以放那么多东西
魔塔大概也就用了5000左右的mem吧
但是魔塔的g1a却有47.4K!(想想那个geom吧)
到底是怎么回事?!
发表于 2012-8-11 21:54:30 | 显示全部楼层
6# GWHBOB

使用了头文件里函数——占空间
自己写的函数——占空间...
 楼主| 发表于 2012-8-11 22:00:01 | 显示全部楼层
蛋看下魔塔的lst:
  1. ******* SECTION SIZE INFORMATION *******

  2. PROGRAM  SECTION (P):                               00002DA4 Byte(s)
  3. PROGRAM  SECTION (P_BR_Size):                       00000000 Byte(s)
  4. PROGRAM  SECTION (P_TOP):                           0000000C Byte(s)
  5. CONSTANT SECTION (C):                               000046DD Byte(s)
  6. CONSTANT SECTION (C_BR_Size):                       00000000 Byte(s)
  7. CONSTANT SECTION (C_TOP):                           00000000 Byte(s)
  8. DATA     SECTION (D):                               000001F4 Byte(s)
  9. DATA     SECTION (D_BR_Size):                       00000000 Byte(s)
  10. DATA     SECTION (D_TOP):                           00000000 Byte(s)
  11. BSS      SECTION (B):                               00000BF4 Byte(s)
  12. BSS      SECTION (B_BR_Size):                       00000004 Byte(s)
  13. BSS      SECTION (B_TOP):                           00000000 Byte(s)

  14. TOTAL PROGRAM SIZE: 00008279 Byte(s)
复制代码
友情提示:0x8279=33401 Bytes
 楼主| 发表于 2012-8-11 22:07:43 | 显示全部楼层
好吧我忘了加constj_0012.gif
其实是可以的:
  1. const unsigned char mem[12345678]={0};
复制代码
然后目录下多了个11M的add-in
啦啦啦啦啦啦
表示之前我都是这么做的:
  1. const unsigned char mem[]={0,0,0,0,0,…………};
复制代码
j_0003.gif
 楼主| 发表于 2012-8-11 22:28:45 | 显示全部楼层
  1. #include "fxlib.h"
  2. #include "stdarg.h"
  3. const unsigned char mem[9000]={0};
  4. unsigned char mem2[100];
  5. unsigned char *p,*p2,*p4;
  6. int (*p3)();
  7. int fun()
  8. {
  9.         ;
  10. }
  11. int printf7(int x,int y,char * msg,...)
  12. {
  13.         unsigned char c1,c2;
  14.         unsigned char buf[128];
  15.         va_list  arg_list;

  16.         va_start        (arg_list,msg);
  17.         vsprintf        ((char*)buf,msg,arg_list);
  18.         va_end                (arg_list);
  19.         
  20.         PrintXY (x,y,buf,0);

  21. }
  22. int AddIn_main(int isAppli, unsigned short OptionNum)
  23. {
  24.     unsigned int key;

  25.     Bdisp_AllClr_DDVRAM();

  26.     p=&mem[0];
  27.     p2=&mem2[0];
  28.     p3=fun;
  29.     p4=(unsigned char*)"hello,world!";
  30.     p[0]=1;p[5127]=2;p[5128]=3;p[5129]=4;
  31.     printf7(0,0,"%x,%x,%x",p[0],p[5127],p[5128]);
  32.     printf7(0,10,"%x,%x,%x",p,&p[5127],&p[5128]);
  33.     printf7(0,20,"%x,%x,%x",p2,p3,p4);

  34.     while(1){
  35.         GetKey(&key);
  36.     }

  37.     return 1;
  38. }
复制代码
Output:
  1. 0,0,0
  2. 3033d4,3047db,3047dc
  3. 8100004,30020c,3056fc
复制代码
你有什么感悟?
发表于 2012-8-11 22:35:34 | 显示全部楼层
10# GWHBOB

模拟器还是真机的结果?别告诉我他们是线性顺序排列下来的..
 楼主| 发表于 2012-8-11 23:04:15 | 显示全部楼层
11# diameter
模拟器……17mb耶~~~
就是变量放在800多,然后常量和函数指针(就是程序了,我猜)放在30多
但既然魔塔没有crash这个也不会有问题只要你吃得下17mb
发表于 2012-8-12 02:05:36 | 显示全部楼层

标题

本帖最后由 Wudy 于 2012-8-12 02:16 编辑

启动一个add-in,os会把add-in文件装入0x00300000。
add-in文件有200b的文件头(存版本,图标之类的),所以真正的机器码是从0x00300200开始的,装入之后让指令指针寄存器指向0x00300200,程序就开始执行了。
这些初始化代码sdk都会帮你完成。
0x08100000开始是data段和bss段。sdk也会帮你初始化这两个段。
data段存储已经初始化的全局变量,静态变量,
bss段保存未初始化的全局变量和静态变量。
data段占可执行文件的空间,bss段不占空间!
因为bss段只需记录大小,程序运行的时候分配一段跟在data段后面就行了。
到这里,基本可以解释上面几楼的问题了。

想用指针乱访问肯定是不行的,想一下子多出很多可用的存储空间基本也不太可能。
还有一些见我syscall教程贴里pdf文档第7,11页。
 楼主| 发表于 2012-8-12 10:38:31 | 显示全部楼层
恩恩他是Data,Bss有限制,Const,Program随便
 楼主| 发表于 2012-8-12 10:42:28 | 显示全部楼层
启动一个add-in,os会把add-in文件装入0x00300000。
add-in文件有200b的文件头(存版本,图标之类的),所以真正的机器码是从0x00300200开始的,装入之后让指令指针寄存器指向0x00300200,程序就开始执行了。
这些 ...
Wudy 发表于 2012-8-12 02:05

OS会把¥@?!装到0x00300000,这么说那儿是可以乱堆东西的哈哈,就不知道怎么才能强行进去。
那么他内存到底有多大?求解释。
还有那个魔塔变慢的问题,求原因!!
发表于 2012-8-12 10:55:02 | 显示全部楼层
你看过我说的那几页了?
发表于 2012-8-12 11:23:16 | 显示全部楼层
翻了翻编译器手册,记得看到有优化选项的
 楼主| 发表于 2012-8-12 11:42:09 | 显示全部楼层
哈哈!
有512K的ram和4mb的flash
不知道能不能全部开发出来~
发表于 2013-9-4 03:24:12 | 显示全部楼层
看看
发表于 2013-9-4 03:25:48 | 显示全部楼层
怎样才可以看到SD卡里面的TXT文件?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cnCalc计算器论坛

GMT+8, 2024-4-20 13:08 , Processed in 0.097807 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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