PLT 板


LINE

看板 PLT  RSS
( https://goo.gl/W4cwGn )会选择 c++ 来开发 scheme, 最主要是因为 c++ 的标准程式 库有很多好用的 class: string, vector, map, list ... 不用为了这些基本的东西伤脑 筋; 但这次要开发的是 - 在作业系统之前的 scheme (开发平台是 stm32f4discovery), 这些好东西通通派不上用场, 没有 malloc/new, 又怎麽能用这些东西呢! 甚至连 global object 都不能用, 所以几乎和使用 c 一样, 不过还是能用上点 c++ 的特性。 原本程式中用到 list, vector, map 的部份, 通通要改, 全部改用 array, 不够弹性, 但容易实作, 至於 input/output function, 需改用 uart 这部份的程式码, 所以直接把 之前搞定的 uart 程式码复制一份过来修改。 getline 我得换成 getchar uart 的版本, cout 也要换成 myprint uart 的版本, 这之 前都做过了, 把以前的努力都集合起来就可以, scanner 的作法则改为一次读一个 byte 来转成 token, s-express 不复杂, 但我觉得还是不容易, 没想到花点时间竟然搞定, 感 谢周自制本言 ( http://goo.gl/X8U0CW )的 scanner 这节提供的知识。 再来是 malloc Cell* 的部份, 由於在重写 struct Cell 时, 我就考虑到在 stm32f4discovery 开发板上执行, 也就是没有 os 的环境, 所以才使用了 array pool 来得到一个 Cell 的记忆体。虽然没有弹性, 但能简化问题, 再搭配一些人工手法, 可以 减低 pool 可能会不够用的问题。 我先在 qemu stm32 p103 emulator 上测试, 等成功了再上到 stm32f4discovery, 减少 flash 读写次数。也的确有必要, 光在模拟器上就测试了无数次, 减少了多次的 flash 读写。 在制作 p103 emulator 的版本阶段, 出了一个 link 问题: [email protected]:descent/stm32_p103_demos.git stm32_p103_demos/demos/uart_echo git commit: 6b2df2c6e62f3c48a6c6dc20c76367124c1ca447 bss_to_big 1 /home/descent/arm-cs-tools/lib/gcc/arm-none-eabi/4.7.3/../../../../arm-none-eabi/bin/ld: mymain.elf section `.bss' will not fit in region `RAM' 2 /home/descent/arm-cs-tools/lib/gcc/arm-none-eabi/4.7.3/../../../../arm-none-eabi/bin/ld: region `RAM' overflowed by 34085848 bytes 3 collect2: error: ld returned 1 exit status 我以为我已经很了解 link 的问题了, 这应该难不倒我, 就是哪个 section 太大, 整个 记忆体空间不足嘛! 吓不了我的。但随着时间的过去, 我还是无法处理这问题, 乱 google 找问题, 我 - 开始紧张了, 原来我还有没搞懂的东西。 当然最後还是搞定了, 原因是: bss 竟然需要 34M 的记忆体空间, 吓坏我了, p103 只有 20K ram, 把 main.ld 的 RAM 从 20K 改成 48M 就可以编过, 但想也知道, 放入 flash 执行, 一定挂掉。 main.ld MEMORY { FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 128K RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 20K -> 48M } ... ... 我当然是不会用这麽蠢的改法。程式中用到相当多的 global variable (global variable 不一定占据 bss, 得找对才行), 来把他们减少, shorten_bss L32 的效果最好 , /bin/ld: region `RAM' overflowed by 877288 bytes collect2: error: ld returned 1 exit status 从 34M 降到 877K, 效果不错, 可是还不够 ... shorten_bss 1 diff --git a/cell.h b/cell.h 2 index d7238ea..eb36b5c 100644 3 --- a/cell.h 4 +++ b/cell.h 5 @@ -11,7 +11,7 @@ 6 7 using namespace std; 8 9 -const int MAX_POOL = 1000; 10 +const int MAX_POOL = 70; 11 12 enum PairAttr {HEAD, FIRST, SECOND}; 13 enum CellType {STRING, SYMBOL, NUMBER, PAIR, PRIMITIVE_PROC, NULL_CELL, INVALID}; 14 @@ -21,7 +21,7 @@ struct Environment; 15 struct Cell; 16 typedef Cell *(*ProcType)(Cell *); 17 18 -const int MAX_SIZE = 256; 19 +const int MAX_SIZE = 20; 20 // a variant that can hold any kind of lisp value 21 struct Cell 22 { 23 diff --git a/s_eval.h b/s_eval.h 24 index 37048ac..2da9ae5 100644 25 --- a/s_eval.h 26 +++ b/s_eval.h 27 @@ -4,14 +4,14 @@ 28 #include "cell.h" 29 #include "token_container.h" 30 31 -const int MAX_ENVIRONMENT_POOL = 1000; 32 +const int MAX_ENVIRONMENT_POOL = 10; 33 34 #ifdef USE_CPP_MAP 35 typedef std::map<std::string, Cell*> Frame; 36 #else 37 -const int FRAME_LEN = 128; 38 +const int FRAME_LEN = 56; 39 40 -const int LINE_SIZE = 256; 41 +const int LINE_SIZE = 128; 42 43 struct EnvElement 44 { 45 @@ -29,7 +29,7 @@ struct Environment 46 47 Frame frame_; 48 49 - char name_[255]; // for debug 50 + char name_[12]; // for debug 51 int free_frame_index_; 52 private: 53 }; 胡乱修改後, 总算 link 成功。 机器上的记忆体有 20K, 程式本身有 19K, 载入到记忆体後, 可以正常执行的吗? 不一定 , bss 区域不会占据程式本身, 但是会占用载入时的记忆体位址, 所以还得加上 bss 占 用的记忆体, 若 bss 占据了 2K, 19k+2k = 21k, 记忆体就不够用了。 这便是 link 不过的原因。 还有问题二: 高兴的将程式载入模拟器後, 准备欣赏自己的杰作, 发现: repl 的第一个参数 prompt, 不知道为什麽会被 TokenContainer tc 所影响 (传进来的 参入位址会变成 0), 我把 TokenContainer tc 改成 global variable 才正常 (原本是 auto variable)。 我猜测是 stack 被覆盖了, 不过没有认真追, 也有可能是其他问题。 再来还有一些後续的小问题, 克服他们後, 就是下面影片的成果。 应该离成功不远了 ... 真实机器篇 - stm32f4discovery 事情果然没那麽顺利, 在我将模拟器的程式移植到 stm32f4discovery 後, 没什麽问题, 提示符号出来了, 但是打下 (+ 1 2) 之後, 程式没有印出预期的 3, 而是停止不动。猜 测是 stack 问题 (又是 stack), 将 stack 改大一点就正常执行了。在 x86 记忆体很大 , 不太容易遇到 stack 太小的问题, 但在 stm32f4discovery, 记忆体不大, 只有 192k, 考验我的程式能力。 下面影片是在 minicom 的执行结果: 後来知道了 ccm ( http://goo.gl/ewtkTQ ) 这东西, 把 stack 移到 ccm, 成功挤出更 多记忆体。 支援 backspace 这个常见的的功能还真没那麽简单, call library 果然比较舒服, 思考良久之後, 决定 使用 deque 来完成这个功能, 我参考了 c++ 的 std::deque, 实作了一个 MyDeque, 虽 然我用的是 c++, 不过作业系统之前没有 std::deque 可以用。 MyDeque 提供以下 member function: push_front() 给 ungetch() 用 pop_front() 在 getchar() return 时传最前头的 char push_back() 把输入的 char 存到这个 deque pop_back() 提供了 backspace 的功能 因为这个 mydeque 需要成为一个 global variable, 所以没有提供 ctor, 避免 compile 不过的问题 (你很疑惑为什麽吧?), 不过这不是什麽难题, 我使用了 init() 来 变通, 得自己呼叫 mydeque.init(); 来作初使化的动作, 也如你预期的, 我老是忘记 call .init(), 每每在惊呼「为什麽?」之後才想到自己的疏忽。 使用了一大堆 global variable, 完全不是 c++ 哲学, 就跟你说了, 这是一个长的很像 c 的 c++ 程式。 为了支援 backspace 没想到要多做一个 class, 这是经过深思熟虑後的想法, 也才决定 用 deque (念做 deck), 这还真是个神奇的资料结构。 下面影片显示支援 backspace 的操作: 不过这个实作还有点问题, 超过 MyDeque 的大小, 就会有问题, 所以我把 MyDeque 设到 128 个 int 大小, 暂时躲避这问题。 line edit history 20141115 我加上了 line edit history 的功能, 按下 up/down 就会把之前打过的指令 取出来, 很基本的功能吧! 但要实作这个功能可花了我好大的力气。 我写了一个 deque 的 template 的版本, 一个 CString class 用来支援这样的功能, 所 以前面那个 MyDeque 被移除了。我第一次觉得 c++ template 这麽好用, 感动到痛哭流 涕。虽然 c++ 现在复杂的不像话, 不过程式员只要选择自己要用的部份就好了, 重点是 把程式写出来, 而不是用上什麽新特性。这个程式没有 malloc/free 还不是照样可以完 成。 侦测 up/down key 是个小问题, 答案分别是: up: 27 '[' 'A' down: 27 '[' 'B' right: 27 '[' 'C' left: 27 '[' 'D' 要抓出 3 bytes 才能判断是哪一个方向键。 而 scanner 程式整个重新改写。辛苦完成的 MyDeque 派不上用场了, 以下影片示范这个 功能: 当做出 history 功能时, 自己都觉得很酷, 这个功能真是无敌好用。 这个程式集 os 观念和 scheme interpreter 之大成。是继 simple os 之後的心血, 所 有的东西都自己打造, 很有成就感。 // 本文使用 Blog2BBS 自动将Blog文章转成缩址的BBS纯文字 http://goo.gl/TZ4E17 // blog 版本 http://descent-incoming.blogspot.tw/2014/11/scheme.html --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 180.217.207.157
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/PLT/M.1436600324.A.011.html







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Boy-Girl站内搜寻

TOP