|
本帖最后由 xivisi 于 2013-8-1 16:58 编辑
这段时间,把以前发的那个简陋的RTOS拿出来再造。
一、基础:
毕竟不是学纯软件出身,操作系统原理什么的统统没看过,缺啥补啥。上网还特不方便,想到啥做啥,某些痛苦的情绪时不时出来作怪,烦得很。
线程切换器,内存分配器,各种标准裤的代码也去看看
二、编程语言
本人有极度不喜欢纯汇编,至少也是披着高级语言皮的汇编比如A8的向量表- Arch_Exception::ExceptionVector Arch_Exception::Vector SECTION(".text.Vector")=
- {
- //跳转指令
- {VectorJmpCode,VectorJmpCode,VectorJmpCode,VectorJmpCode,
- VectorJmpCode,VectorJmpCode,VectorJmpCode,VectorJmpCode},
- //跳转表
- {
- Platform::Entry,
- Arch_Exception::UndefinedHander,
- Arch_Exception::SVCHandle,
- Arch_Exception::PrefetchAbortHandle,
- Arch_Exception::DataAbortHandle,
- Arch_Exception::HypervisorHandle,
- Arch_Exception::IRQ_Handler,
- Arch_Exception::FIQ_Handler
- }
- };
复制代码- /*
- 函数: void Arch_Exception::SetException()
- 说明: 将向量表Arch_Exception::Vector的地址写入内核协处理器
- 参数: 无
- 返回: 无
- */
- void Arch_Exception::SetException()
- {
- register unsigned long Value;
- register ExceptionVector* Vectors=&Vector;
- ASM("mrc p15, 0, %0, c1, c0, 0" :"=r"(Value));
- if(Vectors==(ExceptionVector*)0xFFFF0000) Value=Value|(1<<13);
- else ASM("mcr p15, 0, %0, c12, c0, 0"::"r"(Vectors));
- ASM("mcr p15, 0, %0, c1, c0, 0" : :"r" (Value));
- }
复制代码 可重入的IRQ中断要考虑线程切换,不同模式之间sprs, sp寄存器无法直接访问,保存现场时蛋疼的将模式切换来切换去- NAKE void Arch_Exception::IRQ_Handler()
- {
- //获得中断前的PC
- register UINT PC;
- register UINT LR asm("lr");
- asm("push {%0}\n sub %0, %1, #4" :"=r"(PC) :"r"(LR));
- //获取中断之前的模式
- register UINT LastMode asm("lr");
- asm("mrs %0, spsr\n and %0, %0, #0x1F\n cmp %0, #0x10\n moveq %0, #0x1F\n orr %0, %0, #0xC0\n":"=r"(LastMode));
- //转换到进入中断之前的模式
- asm("msr cpsr_c, %0" :"=r"(LastMode));
- //保存PC
- asm("push {%0}\n msr cpsr_c, 0x92"::"r"(PC));
- //保存通用寄存器
- asm("pop {%0}":"=r"(PC));
- asm("msr cpsr_c, %0\n push {r0-r12, lr}\n msr cpsr_c, #0x92"::"r"(LastMode));
- //保存spsr, 返回SP
- Processor::CoreContext* Context asm ("r0");
- asm("mrs %0, spsr\n msr cpsr_c, %1\n push {%0}\n mov %0, sp\n msr cpsr_c, #0x92":"=r"(Context):"r"(LastMode));
- //asm("push {r0}");
- //r0====SP
- Context=VIC::NestedInterruptHandle(Context);
- //恢复 spsr, pc
- asm("msr cpsr_c, lr");
- asm("mov sp, %0"::"r"(Context));
- asm("pop {r0}");
- asm("msr cpsr_c, r0");
- asm("ldmfd sp!, {r0-r12, lr, pc}");
- }
复制代码 编程语言的选择: c和c++之间摇摆不定,毕竟c++的很多特性,用起来实在是觉得方便,代码重用度也高,只是效率比c差一点点,仔细看看编译出来的代码,还好差的不算太多。
也曾用c来模拟c++的类,只不过效率(嗯,开发效率)比较低
比如线程,为了更好的代码重用,而不增加更多的点啊箭头(->)什么的结构体的数据成员,单独同了一个ob文件来做,不知道前人是否有这样做过- struct Thread
- {
- #define OBJ_NAME Thread
- #include "Kernel/Object.ob"
- #include "Kernel/Thread.ob"
- #undef OBJ_NAME
- };
复制代码
另外,不得不吐槽一下,不知道是不是我的优化等级开得低,编译器对寄存器的使用效率比人工差那么一点,明明几条汇编可以搞定的,非要多几条汇编。
最终还是选了 c++开发效率和运行效率的折中
三、开发工具选择——没有完美的
各种工具要么某个功能很好用,但是另一个好用的功能怎么没有,或者怎么运行起来,稳定性就差那么一点(linux下问题比较多)
比如:jlink的驱动,在模式切换时单步调试就会挂,设置断点略过就没问题
比如:Eclipse的ava的自动完成就很好用,到了c\c++就得快捷键手动开启,多我这个打字还在看键盘的人来说,麻烦。
四、代码风格
我学编程,最开始学的是pascal(竞赛用),然后自学vb,自学c\c++,自学vc,大学里选修了java而java的命名规范很合我的胃口,匈牙利命名法虽然简洁不少,但始终不怎么习惯,遇到这样的代码第一步就是refactoe->rename 至少我觉得,能从标识符判断功能的比较好(懒人,懒得写注释的说,我的代码注释比较少),缺点就是,有时候变量名巨长无比,没有自动完成功能,输入字符也是一件麻烦的事
五、交流太少
不知道是否我问问题比较偏门或者冷门,又或者本人自己问题,发帖问问题什么的,回答的人很少。或许和性格有关吧。而那个组织也时不时在周围纠缠。
比如有次在论坛,向一位网友买了12864,拿到手之后,怎么也用不上,其中一个还是上电就发烫的,我向买主咨询,他说没问题。卖主似乎被我问的烦了,就给我退了款,我问是否要寄回去,对方说不用。后来我进的某些技术群,时不时有人就说我连12864都不会用的,我会用,自然以为说的不是我,那是有人还问我是不是学生,我依然莫名其妙。
后来,QQ上有人(我不知道是哪个人)自称是 他弄坏的。而某次,QQ群里(CB那个视频处理群还是M4群?我忘记了)有人说我的女人给他两万,叫他保全我的名声,去TMD我那时候女人都没有怎么可能。那个人还自称,真的给他打了钱。我否认之后,那个人又说有人叫他换回钱去,更具体的我不得而知。
我从未自称是什么高手,只是一个比初学者走得早一点,走得比别人慢一点罢了。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|