设为首页收藏本站

爱吱声

 找回密码
 注册
搜索
查看: 6165|回复: 17
打印 上一主题 下一主题

[工程技术] 从丰田车控谈工控编程

[复制链接]
  • TA的每日心情
    开心
    2018-2-15 10:06
  • 签到天数: 112 天

    [LV.6]出窍

    楼主
    发表于 2014-1-2 17:43:30 | 显示全部楼层
    关于堆栈的讨论:, d$ G( w/ c0 X& {
    我个人觉得原文说堆栈出问题影响到邻近内存区还是有可能的,我遇到过这样的情况,大概如下:
    1 ^! d' @8 I& V+ I4 {, l3 n8 F/ \|OS reserved area.......................<----.....stack area|( S% d$ P8 x$ a- ^
    这种系统stack point是倒着长的,即箭头方向。当时的情况就是stack area未分配够,结果几次函数调用后,os reserved area的数据给毁了一部分——这在当时是看不出什么后果的,是到了后面其它函数运行时数据不正常导致系统垮掉了。
  • TA的每日心情
    开心
    2018-2-15 10:06
  • 签到天数: 112 天

    [LV.6]出窍

    沙发
    发表于 2014-1-3 07:44:19 | 显示全部楼层
    晨枫 发表于 2014-1-2 23:12
    9 X* _: m. Y, i3 y6 H那为什么不对stack point能放的位置限制在stack area里呢?当然,这样中断就继续不下去了。不过让stack p ...

      u( w, K2 t6 [8 ^, s( f嗯,理论上说是可以自己计算在当前栈占用了多少空间,但实际上很难做到。
    3 d0 d# q( l  U: b首先这跟CPU体系结构有关系,尤其是CISC的CPU在这里计算很麻烦,它要判断段的属性(栈段有可能向下长也可能向上长),一会加一会减还要变号很让程序员崩溃;
    0 ~" t# l0 |+ s) y! w其次部分指令是隐含自己压栈的,比如INT指令,从面上看没有任何压栈操作,但实际上该指令周期内是自动做了压栈的,加上部分CPU有不同保护级,在级间切换时栈段空间也要切换。这一部分也跟CPU有关系。& |7 ^' l( E$ g: t* e9 u5 |1 A
    再次,做嵌入式的程序员由于资源受限,有时为了优化会写很多变态代码——比如交换两变量,先push再pop一下,比直接用中间变量交换快且代码短,遇到这种情况再想算清楚栈上用了多少空间几乎成不可能的事了。
    ' Q) q( |* K1 P4 ~2 r* t很多是通过间接手段限制的,就是设立专门的栈段,然后靠段自己的保护机制(段限长不应该突破)越界时出现fault就知道发生了栈溢出。

    手机版|小黑屋|Archiver|网站错误报告|爱吱声   

    GMT+8, 2024-6-8 03:56 , Processed in 0.033488 second(s), 17 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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