xivisi 发表于 2013-8-1 16:27:00

一点感想——闭门造轮子

本帖最后由 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我那时候女人都没有怎么可能。那个人还自称,真的给他打了钱。我否认之后,那个人又说有人叫他换回钱去,更具体的我不得而知。

我从未自称是什么高手,只是一个比初学者走得早一点,走得比别人慢一点罢了。

jetlib 发表于 2013-8-2 11:37:45

这都神马乱起八糟的东东?前半部好像技术贴,后半部好像小说?

electrlife 发表于 2013-8-2 12:22:26

如果LZ是出于学习的目的,确可以理解,如果是项目需要,
大可以在现有的大量的RTOS上修改以适应自己的需求,凭空造
车是有相当的难度!

Gorgon_Meducer 发表于 2013-8-4 10:09:05

必须要支持一下!

xivisi 发表于 2013-8-6 12:54:22

electrlife 发表于 2013-8-2 12:22 static/image/common/back.gif
如果LZ是出于学习的目的,确可以理解,如果是项目需要,
大可以在现有的大量的RTOS上修改以适应自己的需求 ...

算是学习目的

jameszxj 发表于 2013-8-6 14:50:45

electrlife 发表于 2013-8-2 12:22 static/image/common/back.gif
如果LZ是出于学习的目的,确可以理解,如果是项目需要,
大可以在现有的大量的RTOS上修改以适应自己的需求 ...

支持这种看法

jungleyang 发表于 2013-8-6 17:58:04

这都神马乱起八糟的东东?前半部好像技术贴,后半部好像小说?

xivisi 发表于 2013-8-7 07:43:41

jungleyang 发表于 2013-8-6 17:58 static/image/common/back.gif
这都神马乱起八糟的东东?前半部好像技术贴,后半部好像小说?

这位网友不长脑子吗? 你是人云亦云呢?还是人云亦云呢?
又或者说,你那个垃圾组织的终于忍不住跳出来了?

xivisi 发表于 2013-8-7 07:46:33

jetlib 发表于 2013-8-2 11:37 static/image/common/back.gif
这都神马乱起八糟的东东?前半部好像技术贴,后半部好像小说?

表示怀疑,几年前,那个垃圾组织就是在我觉得有异常的时候,躲在我熟悉的人的背后,给出了一个 貌似合理的理由,只不过现在是对别人了。又用这种手段吗?占了一半吗?你会数数吗?垃圾组织!

xivisi 发表于 2013-8-7 07:48:23

jameszxj 发表于 2013-8-6 14:50 static/image/common/back.gif
支持这种看法

确实,比较麻烦,实现不难,难的是找到一个合适合用的。必定要在各种算法之间选来选去的。

jetlib 发表于 2013-8-7 08:30:05

xivisi 发表于 2013-8-7 07:43 static/image/common/back.gif
这位网友不长脑子吗? 你是人云亦云呢?还是人云亦云呢?
又或者说,你那个垃圾组织的终于忍不住跳出来了 ...

嗯,你长了脑子。怪我实在没看明白你想说什么。尤其后面什么给女人钱啥的。另外不知怎么又跳出个“垃圾组织”这个词,也不知是什么组织。也许你活在你的世界里,有小说样的情节。可惜我这个外人实在不知,也不想猜。顺嘴接话,到此为止。

xivisi 发表于 2013-8-7 08:44:01

jetlib 发表于 2013-8-7 08:30 static/image/common/back.gif
嗯,你长了脑子。怪我实在没看明白你想说什么。尤其后面什么给女人钱啥的。另外不知怎么又跳出个“垃圾组 ...

OK 如果错怪我可以道歉,你无视就好。
另,我再次强调,我不是写小说,因为被说的多了,反感。
另,之所以加上,仅仅是为了说明一些事而已,如果在那个群里的人自然知道。

另外,再次表示,你回的帖子是我写给别人的。又或者都是你?

xivisi 发表于 2013-8-7 08:46:26

以后 技术贴 不讨论此类话题,我也没将那个帖子放在技术板块。

jungleyang 发表于 2013-8-7 15:44:49

jetlib 发表于 2013-8-7 08:30 static/image/common/back.gif
嗯,你长了脑子。怪我实在没看明白你想说什么。尤其后面什么给女人钱啥的。另外不知怎么又跳出个“垃圾组 ...

有人回了就算了,后面确实看不明白,不知道这哥们火气为什么这么大!
页: [1]
查看完整版本: 一点感想——闭门造轮子