免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ifreecoding
打印 上一主题 下一主题

有源码有图有真相,使用C语言写了2个小型嵌入式操作系统内核,支持ARM7、cortex-M3芯 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2012-05-31 18:45 |只看该作者
楼上那些人,一点都不体会嵌入式的苦B啊,
这种系统能把进程调度做好就不错了,文件系统(操作系统抽象的“文件”系统)什么不用。
访问文件找个文件系统(物理介质)的函数库就行。

论坛徽章:
0
32 [报告]
发表于 2012-05-31 18:50 |只看该作者
其实我觉得,像malloc这种,都不要去调用,
谁要使用semaphore,叫他自己提供buffer好了。
  pucSemMemAddr = malloc(sizeof(M_SEM) + 3);

如果一定要用,建议将结果挂到list上,下次直接拿来用。

这种系统,经不起malloc/free的折腾的。




论坛徽章:
0
33 [报告]
发表于 2012-05-31 20:05 |只看该作者
本帖最后由 ifreecoding 于 2012-05-31 20:31 编辑
AD8018 发表于 2012-05-31 18:37
还有个挺重要的,task有优先级,
有mutex和优先级翻转的考虑吗?


5.8节是优先级翻转,现在book还没写到,代码写完了

这个系统主要目的是用来掩饰的,没有过于追求性能,所以都是用函数实现的,再说我写的是汇编函数,又没有入口参数,没有返回值,不需要做函数跳转的压栈出栈操作,与inline区别不大吧。CPSID就是设置PRIMASK的指令,你用的__set_PRIMASK应该是一个函数吧,里面封装的也许就是CPSID指令,不一定比我用的那两条指令周期短


MDS_IntDisable
    CPSID  i
    BX     R14



__INLINE void MDS_IntDisable()
{
     __set_PRIMASK(1);
}

论坛徽章:
0
34 [报告]
发表于 2012-05-31 22:34 |只看该作者
本帖最后由 AD8018 于 2012-05-31 22:42 编辑

回复 33# ifreecoding

可以参考arm指令集的cpu cycles数算一下---

调用原有的MDS_IntDisable,因为是汇编写成的,不会优化,至少要
BL 到函数     //1+P cpu cycles
CPSID  i       //1~2 cpu cycles
BX     R14   //1+P cpu cycles
三条指令。其中有两条跳转指令。
总花费时间在 4+2P 或 5+2P之间,其中P = 1~3

调用新的__set_PRIMASK(1); 写成的,
因为用的inline,__set_PRIMASK也是编译器提供的,新版Keil早已不用函数完成,
完全无函数调用的开销。
如果__set_PRIMASK是CPSID实现的,
  总花费时间是 1~2 cpu cycles,
如果用mov寄存器方式实现的,花费时间是2 cpu cycles










   

论坛徽章:
0
35 [报告]
发表于 2012-05-31 23:30 |只看该作者
walleeee 发表于 2012-05-28 14:31
回复 7# ifreecoding


  嵌入式操作系统里面,没有内存管理没有文件系统的挺常见的,大名鼎鼎的ucos也是如此

论坛徽章:
0
36 [报告]
发表于 2012-06-01 04:42 |只看该作者
AD8018 发表于 2012-05-31 22:34
回复 33# ifreecoding

可以参考arm指令集的cpu cycles数算一下---


你说的我不信,你把你写的直接反汇编,贴代码来看

论坛徽章:
0
37 [报告]
发表于 2012-06-01 09:20 |只看该作者
ifreecoding 发表于 2012-06-01 04:42
你说的我不信,你把你写的直接反汇编,贴代码来看


你还真是耍大牌,C代码帮你写了,反汇编你不会自己去看啊。。
又不是我的程序,又不是我的客户,信不信拉倒。

论坛徽章:
0
38 [报告]
发表于 2012-06-01 09:29 |只看该作者
楼主4:42回复,是没睡还是闻鸡起舞

提供Corext M3指令所花时间的列表
http://infocenter.arm.com/help/t ... 0337i/CHDDIGAC.html

论坛徽章:
0
39 [报告]
发表于 2012-06-01 19:47 |只看该作者
[quote]AD8018 发表于 2012-06-01 09:20
你还真是耍大牌,C代码帮你写了,反汇编你不会自己去看啊。。
又不是我的程序,又不是我的客户,信不信拉倒。quote]

那好吧,我来反汇编
__set_PRIMASK不是指令也不是编译器提供的,是ST公司的库里带的函数,在core_cm3.c文件中,最终还是要被编译成汇编指令
__set_PRIMASK的原型为:
static __INLINE void __set_PRIMASK(uint32_t priMask)
{
  register uint32_t __regPriMask         __ASM("primask");
  __regPriMask = (priMask);
}

我在头文件中依照你的方式定义了内联函数:
__INLINE void MDS_IntDisable()
{
    __set_PRIMASK(1);
}

O2优化,__set_PRIMASK被反汇编为
MOVS r0,#0x01
MSR PRIMASK, r0

MOV指令为1周期,MSR为1~2周期,时间确实有减少

论坛徽章:
0
40 [报告]
发表于 2012-08-23 16:05 |只看该作者
nice job,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP