9860sdk里关于内外存读取的问题
(写的有点凌乱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官方 本帖最后由 diameter 于 2012-8-11 20:50 编辑
1# GWHBOB
开const能开到1g!!!!不能啊,下面这段代码就不能通过编译
typedef unsigned char byte;
const byte test_data; /* 全局变量哦 */
错误信息是The size of B and R section should be 0x2000 bytes or less.
说明全局变量(在静态区)大小不能超过0x2000(dec:8192)byte
但是在栈上(比如函数里),和堆上(用malloc,calloc分配)就不存在这个问题了
(我手上没机器没法测试) 下面的代码编译出来996字节
#include <fxlib.h>
typedef unsigned int uint;
typedef unsigned char byte;
const byte test_data;
int AddIn_main(int isAppli, unsigned short OptionNum)
{
byte a;
uint key;
Bdisp_AllClr_DDVRAM();
while (1);
{
GetKey(&key);
}
return 1;
}
/* 后面繁琐的#pragma预处理省略 */
把
const byte test_data;
改成
const byte test_data={0};
再编译立马成9kb了!是不是神奇... LZ应该见过最新的道路之星吧,它已经达到190多k了..我怀疑它就是把汉字库打包进了里面。
我没记错的话hzk是可以压缩的(ccdos里面就有),仙剑里面的字体文件(应该是16*16的)居然才60多k,没天理啊..
我们能不能找到将文件装入addin的途径? 本帖最后由 diameter 于 2012-8-11 21:20 编辑
我在工程的debug文件夹下翻到了lst文件,里面居然全是汇编!就是每个.c源文件的汇编代码。
这个发现可能会有用。关于sh的汇编参加wudy发过的帖子http://www.cncalc.org/viewthread.php?tid=7016
SH SERIES C/C++ Compiler (Ver. 6.0C) 11-Aug-2012 20:52:33PAGE 1
************ OBJECT LISTING ************
FILE NAME: E:\techtst\techtst.c
SCT OFFSET CODE C LABEL INSTRUCTION OPERAND COMMENT
techtst.c 1 #include <fxlib.h>
techtst.c 2
techtst.c 3 typedef unsigned int uint;
techtst.c 4
techtst.c 5 typedef unsigned char byte;
techtst.c 6
techtst.c 7 const byte test_data={0};
techtst.c 8
techtst.c 9
techtst.c 10 int AddIn_main(int isAppli, unsigned short OptionNum)
P 00000000 _AddIn_main: ; function: AddIn_main
; frame size=8200
00000000 9005 MOV.W L314,R0 ; H'DFF8
00000002 3F0C ADD R0,R15
techtst.c 11 {
techtst.c 12 byte a;
techtst.c 13 uint key;
techtst.c 14 Bdisp_AllClr_DDVRAM();
00000004 D302 MOV.L L314+2,R3; _Bdisp_AllClr_DDVRAM
00000006 430B JSR @R3
00000008 0009 NOP
techtst.c 15 while (1);
0000000A L310:
0000000A AFFE BRA L310
0000000C 0009 NOP
0000000E L314:
0000000E DFF8 .DATA.W H'DFF8
00000010 <00000000> .DATA.L _Bdisp_AllClr_DDVRAM
techtst.c 16 {
techtst.c 17 GetKey(&key);
techtst.c 18 }
techtst.c 19 return 1;
techtst.c 20 }
techtst.c 21
techtst.c 22
techtst.c 23
techtst.c 24
techtst.c 25
techtst.c 26 #pragma section _BR_Size
techtst.c 27 unsigned long BR_Size;
techtst.c 28 #pragma section
techtst.c 29
techtst.c 30
techtst.c 31 #pragma section _TOP
techtst.c 32
techtst.c 33 int InitializeSystem(int isAppli, unsigned short OptionNum)
P_T 00000000 _InitializeSystem: ; function: InitializeSystem
; frame size=0
techtst.c 34 {
techtst.c 35 return INIT_ADDIN_APPLICATION(isAppli, OptionNum);
00000000 D301 MOV.L L315+2,R3; _INIT_ADDIN_APPLICATION
00000002 432B JMP @R3
00000004 0009 NOP
00000006 L315:
SH SERIES C/C++ Compiler (Ver. 6.0C) 11-Aug-2012 20:52:33PAGE 2
SCT OFFSET CODE C LABEL INSTRUCTION OPERAND COMMENT
00000006 0000 .DATA.W 0
00000008 <00000000> .DATA.L _INIT_ADDIN_APPLICATION
techtst.c 36 }
techtst.c 37
techtst.c 38 #pragma section
techtst.c 39
C 00000000 _test_data: ; static: test_data
00000000 00 .DATA.B H'00
00000001 00001F3F01 .DATAB.B 7999,0
00
B_B 00000000 _BR_Size: ; static: BR_Size
00000000 00000004 .RES.L 1
SH SERIES C/C++ Compiler (Ver. 6.0C) 11-Aug-2012 20:52:33PAGE 1
******** STATISTICS INFORMATION ********
********** ERROR INFORMATION ***********
NUMBER OF ERRORS: 0
NUMBER OF WARNINGS: 0
******* SOURCE LINE INFORMATION ********
COMPILED SOURCE LINE: 39
******* SECTION SIZE INFORMATION *******
PROGRAMSECTION (P): 00000014 Byte(s)
PROGRAMSECTION (P_BR_Size): 00000000 Byte(s)
PROGRAMSECTION (P_TOP): 0000000C Byte(s)
CONSTANT SECTION (C): 00001F40 Byte(s)
CONSTANT SECTION (C_BR_Size): 00000000 Byte(s)
CONSTANT SECTION (C_TOP): 00000000 Byte(s)
DATA SECTION (D): 00000000 Byte(s)
DATA SECTION (D_BR_Size): 00000000 Byte(s)
DATA SECTION (D_TOP): 00000000 Byte(s)
BSS SECTION (B): 00000000 Byte(s)
BSS SECTION (B_BR_Size): 00000004 Byte(s)
BSS SECTION (B_TOP): 00000000 Byte(s)
TOTAL PROGRAM SIZE: 00001F64 Byte(s)
********** LABEL INFORMATION ***********
NUMBER OF EXTERNAL REFERENCE SYMBOLS: 3
NUMBER OF EXTERNAL DEFINITION SYMBOLS: 4
NUMBER OF INTERNAL/EXTERNAL SYMBOLS: 10
*** COMMAND PARAMETER ***
-subcommand=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\hmkC0.tmp
2# diameter
好吧你对的,只是没想到8k可以放那么多东西
魔塔大概也就用了5000左右的mem吧
但是魔塔的g1a却有47.4K!(想想那个geom吧)
到底是怎么回事?! 6# GWHBOB
使用了头文件里函数——占空间
自己写的函数——占空间... 蛋看下魔塔的lst:******* SECTION SIZE INFORMATION *******
PROGRAMSECTION (P): 00002DA4 Byte(s)
PROGRAMSECTION (P_BR_Size): 00000000 Byte(s)
PROGRAMSECTION (P_TOP): 0000000C Byte(s)
CONSTANT SECTION (C): 000046DD Byte(s)
CONSTANT SECTION (C_BR_Size): 00000000 Byte(s)
CONSTANT SECTION (C_TOP): 00000000 Byte(s)
DATA SECTION (D): 000001F4 Byte(s)
DATA SECTION (D_BR_Size): 00000000 Byte(s)
DATA SECTION (D_TOP): 00000000 Byte(s)
BSS SECTION (B): 00000BF4 Byte(s)
BSS SECTION (B_BR_Size): 00000004 Byte(s)
BSS SECTION (B_TOP): 00000000 Byte(s)
TOTAL PROGRAM SIZE: 00008279 Byte(s)
友情提示:0x8279=33401 Bytes 好吧我忘了加constj_0012.gif
其实是可以的:const unsigned char mem={0};然后目录下多了个11M的add-in
啦啦啦啦啦啦
表示之前我都是这么做的:const unsigned char mem[]={0,0,0,0,0,…………};j_0003.gif #include "fxlib.h"
#include "stdarg.h"
const unsigned char mem={0};
unsigned char mem2;
unsigned char *p,*p2,*p4;
int (*p3)();
int fun()
{
;
}
int printf7(int x,int y,char * msg,...)
{
unsigned char c1,c2;
unsigned char buf;
va_listarg_list;
va_start (arg_list,msg);
vsprintf ((char*)buf,msg,arg_list);
va_end (arg_list);
PrintXY (x,y,buf,0);
}
int AddIn_main(int isAppli, unsigned short OptionNum)
{
unsigned int key;
Bdisp_AllClr_DDVRAM();
p=&mem;
p2=&mem2;
p3=fun;
p4=(unsigned char*)"hello,world!";
p=1;p=2;p=3;p=4;
printf7(0,0,"%x,%x,%x",p,p,p);
printf7(0,10,"%x,%x,%x",p,&p,&p);
printf7(0,20,"%x,%x,%x",p2,p3,p4);
while(1){
GetKey(&key);
}
return 1;
}
Output:0,0,0
3033d4,3047db,3047dc
8100004,30020c,3056fc你有什么感悟? 10# GWHBOB
模拟器还是真机的结果?别告诉我他们是线性顺序排列下来的.. 11# diameter
模拟器……17mb耶~~~
就是变量放在800多,然后常量和函数指针(就是程序了,我猜)放在30多
但既然魔塔没有crash这个也不会有问题只要你吃得下17mb
标题
本帖最后由 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页。 恩恩他是Data,Bss有限制,Const,Program随便 启动一个add-in,os会把add-in文件装入0x00300000。
add-in文件有200b的文件头(存版本,图标之类的),所以真正的机器码是从0x00300200开始的,装入之后让指令指针寄存器指向0x00300200,程序就开始执行了。
这些 ...
Wudy 发表于 2012-8-12 02:05 http://www.cncalc.org/images/common/back.gif
OS会把¥@?!装到0x00300000,这么说那儿是可以乱堆东西的哈哈,就不知道怎么才能强行进去。
那么他内存到底有多大?求解释。
还有那个魔塔变慢的问题,求原因!! 你看过我说的那几页了? 翻了翻编译器手册,记得看到有优化选项的 哈哈!
有512K的ram和4mb的flash
不知道能不能全部开发出来~ 看看 怎样才可以看到SD卡里面的TXT文件?
页:
[1]