搜索
bottom↓
回复: 13

一点感想——闭门造轮子

[复制链接]

出0入0汤圆

发表于 2013-8-1 16:27:00 | 显示全部楼层 |阅读模式
本帖最后由 xivisi 于 2013-8-1 16:58 编辑

这段时间,把以前发的那个简陋的RTOS拿出来再造。
一、基础:
毕竟不是学纯软件出身,操作系统原理什么的统统没看过,缺啥补啥。上网还特不方便,想到啥做啥,某些痛苦的情绪时不时出来作怪,烦得很。
线程切换器,内存分配器,各种标准裤的代码也去看看

二、编程语言

本人有极度不喜欢纯汇编,至少也是披着高级语言皮的汇编比如A8的向量表
  1. Arch_Exception::ExceptionVector Arch_Exception::Vector SECTION(".text.Vector")=
  2. {
  3.         //跳转指令
  4.         {VectorJmpCode,VectorJmpCode,VectorJmpCode,VectorJmpCode,
  5.         VectorJmpCode,VectorJmpCode,VectorJmpCode,VectorJmpCode},
  6.         //跳转表
  7.         {
  8.                 Platform::Entry,
  9.                 Arch_Exception::UndefinedHander,
  10.                 Arch_Exception::SVCHandle,
  11.                 Arch_Exception::PrefetchAbortHandle,
  12.                 Arch_Exception::DataAbortHandle,
  13.                 Arch_Exception::HypervisorHandle,
  14.                 Arch_Exception::IRQ_Handler,
  15.                 Arch_Exception::FIQ_Handler
  16.         }
  17. };
复制代码
  1. /*
  2. 函数:        void Arch_Exception::SetException()
  3. 说明:        将向量表Arch_Exception::Vector的地址写入内核协处理器
  4. 参数:        无
  5. 返回:        无
  6. */
  7. void Arch_Exception::SetException()
  8. {
  9.         register unsigned long        Value;
  10.         register ExceptionVector* Vectors=&Vector;

  11.         ASM("mrc p15, 0, %0, c1, c0, 0" :"=r"(Value));
  12.         if(Vectors==(ExceptionVector*)0xFFFF0000) Value=Value|(1<<13);
  13.         else ASM("mcr p15, 0, %0, c12, c0, 0"::"r"(Vectors));
  14.         ASM("mcr p15, 0, %0, c1, c0, 0" : :"r" (Value));
  15. }
复制代码
可重入的IRQ中断要考虑线程切换,不同模式之间sprs, sp寄存器无法直接访问,保存现场时蛋疼的将模式切换来切换去
  1. NAKE void Arch_Exception::IRQ_Handler()
  2. {
  3.         //获得中断前的PC
  4.         register UINT PC;
  5.         register UINT LR asm("lr");
  6.         asm("push {%0}\n sub %0, %1, #4" :"=r"(PC) :"r"(LR));
  7.         //获取中断之前的模式
  8.         register UINT LastMode asm("lr");
  9.         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));
  10.         //转换到进入中断之前的模式
  11.         asm("msr cpsr_c, %0" :"=r"(LastMode));
  12.         //保存PC
  13.         asm("push {%0}\n msr cpsr_c, 0x92"::"r"(PC));
  14.         //保存通用寄存器
  15.         asm("pop {%0}":"=r"(PC));
  16.         asm("msr cpsr_c, %0\n push {r0-r12, lr}\n msr cpsr_c, #0x92"::"r"(LastMode));
  17.         //保存spsr, 返回SP
  18.         Processor::CoreContext* Context asm ("r0");
  19.         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));
  20.         //asm("push {r0}");
  21.         //r0====SP
  22.         Context=VIC::NestedInterruptHandle(Context);
  23.         //恢复 spsr, pc
  24.         asm("msr cpsr_c, lr");
  25.         asm("mov sp, %0"::"r"(Context));
  26.         asm("pop {r0}");
  27.         asm("msr cpsr_c, r0");
  28.         asm("ldmfd sp!, {r0-r12, lr, pc}");
  29. }
复制代码
编程语言的选择: c和c++之间摇摆不定,毕竟c++的很多特性,用起来实在是觉得方便,代码重用度也高,只是效率比c差一点点,仔细看看编译出来的代码,还好差的不算太多。
也曾用c来模拟c++的类,只不过效率(嗯,开发效率)比较低

比如线程,为了更好的代码重用,而不增加更多的点啊箭头(->)什么的结构体的数据成员,单独同了一个ob文件来做,不知道前人是否有这样做过
  1. struct Thread
  2. {
  3. #define OBJ_NAME        Thread
  4. #include "Kernel/Object.ob"
  5. #include "Kernel/Thread.ob"
  6. #undef OBJ_NAME
  7. };
复制代码


另外,不得不吐槽一下,不知道是不是我的优化等级开得低,编译器对寄存器的使用效率比人工差那么一点,明明几条汇编可以搞定的,非要多几条汇编。
最终还是选了 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, 杜汶泽)

出0入0汤圆

发表于 2013-8-2 11:37:45 | 显示全部楼层
这都神马乱起八糟的东东?前半部好像技术贴,后半部好像小说?

出0入0汤圆

发表于 2013-8-2 12:22:26 | 显示全部楼层
如果LZ是出于学习的目的,确可以理解,如果是项目需要,
大可以在现有的大量的RTOS上修改以适应自己的需求,凭空造
车是有相当的难度!

出0入296汤圆

发表于 2013-8-4 10:09:05 | 显示全部楼层
必须要支持一下!

出0入0汤圆

 楼主| 发表于 2013-8-6 12:54:22 | 显示全部楼层
electrlife 发表于 2013-8-2 12:22
如果LZ是出于学习的目的,确可以理解,如果是项目需要,
大可以在现有的大量的RTOS上修改以适应自己的需求 ...

算是学习目的

出0入0汤圆

发表于 2013-8-6 14:50:45 | 显示全部楼层
electrlife 发表于 2013-8-2 12:22
如果LZ是出于学习的目的,确可以理解,如果是项目需要,
大可以在现有的大量的RTOS上修改以适应自己的需求 ...

支持这种看法

出0入0汤圆

发表于 2013-8-6 17:58:04 | 显示全部楼层
这都神马乱起八糟的东东?前半部好像技术贴,后半部好像小说?

出0入0汤圆

 楼主| 发表于 2013-8-7 07:43:41 | 显示全部楼层
jungleyang 发表于 2013-8-6 17:58
这都神马乱起八糟的东东?前半部好像技术贴,后半部好像小说?


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

出0入0汤圆

 楼主| 发表于 2013-8-7 07:46:33 | 显示全部楼层
jetlib 发表于 2013-8-2 11:37
这都神马乱起八糟的东东?前半部好像技术贴,后半部好像小说?


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

出0入0汤圆

 楼主| 发表于 2013-8-7 07:48:23 | 显示全部楼层
jameszxj 发表于 2013-8-6 14:50
支持这种看法

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

出0入0汤圆

发表于 2013-8-7 08:30:05 | 显示全部楼层
xivisi 发表于 2013-8-7 07:43
这位网友不长脑子吗? 你是人云亦云呢?还是人云亦云呢?
又或者说,你那个垃圾组织的终于忍不住跳出来了 ...

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

出0入0汤圆

 楼主| 发表于 2013-8-7 08:44:01 | 显示全部楼层
jetlib 发表于 2013-8-7 08:30
嗯,你长了脑子。怪我实在没看明白你想说什么。尤其后面什么给女人钱啥的。另外不知怎么又跳出个“垃圾组 ...


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

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

出0入0汤圆

 楼主| 发表于 2013-8-7 08:46:26 | 显示全部楼层
以后 技术贴 不讨论此类话题,我也没将那个帖子放在技术板块。

出0入0汤圆

发表于 2013-8-7 15:44:49 | 显示全部楼层
jetlib 发表于 2013-8-7 08:30
嗯,你长了脑子。怪我实在没看明白你想说什么。尤其后面什么给女人钱啥的。另外不知怎么又跳出个“垃圾组 ...

有人回了就算了,后面确实看不明白,不知道这哥们火气为什么这么大!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 11:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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