C51中的函数指针

Reference to Function Pointers in C51.pdf provided by Keil.

8051一个特别之处在于他不用stack而是用fixed memory locations给函数传参。因为8051的stack很小,只有128 bytes。
这样就造成了函数指针(function pointer)使用上的很多问题和限制。

上面说的fixed memory在链接时由编译器指定。
编译器根据程序代码生成一个Call Tree,就是函数调用的关系,谁调用了谁。
这样两个不同时调用的函数就可以共享同一块memory作为传参之用。

编译器不能聪明到知道函数指针代表的是哪一个函数。
初始化和把这个指针作为参数传递的时候,都有可能误认为是一次调用。
于是就会出现Call Tree的构造错误。
此时编译和链接都不会出错,直到运行时,就有可能两个同时运行的(比如funcA执行中调用funcB)函数的传参用地址重叠,发生错误。

可以用链接指令OVERLAY强制指定Call Tree的结构,来避免这个问题。

另外一个问题就是函数的非直接调用(indirectly called function)时,8051要把所有的参数都读到寄存器中。
但是寄存器的大小和个数有限,于是像函数指针这种非直接调用的函数,就最多只能使用三个参数,参数的大小也有限制。

可以考虑把参数放到一个结构(Struct)里面,然后传递这个结构的指针作为参数。

上面两个问题都可以通过reentrant机制来解决。
reentrant是8051提供的一种机制,在IDATA, PDATA, XDATA上面模拟一个Stack。
需要将函数和函数指针都声明成reentrant的。

reentrant会降低程序运行的效率。

C51中的函数指针问题,使得C++这样依靠函数指针实现虚函数等面向对象方法的编程语言无法使用。

Questions from Xiaoying


1.你现在的工作职位,主要职责?对自己未来工作发展的期待?

固件工程师(firmware engineer)。负责手机芯片协议程序开发。

我希望能在相对固定的技术领域稳定工作,时间越长越好。期待公司和行业的发展良好,期待我能在公司和行业的发展中逐渐起到重要作用,期待“。

2.在你看来,“新鲜能力”是什么? 对你现在的工作讲意味着?

新鲜能力(哪个土人想出来的怪词?) = 好奇心 + 踏实的基础知识或能力

意味着有动力有能力不懈不诲地坚持这样枯燥平淡的工作。能够为自己的努力自豪。

3.在你看来,“新鲜能力”是否能够经过努力塑造出来?如果可以,你自己会怎么塑造新鲜能力?或者你自己是如何让自己保持新鲜的?

否。好奇心没法培养,努力也没用。好奇心是“新鲜”的原动力。

要保持“新鲜”,就要努力巩固已有的知识、能力、习惯、性格、原则。因为

一则“温故而知新”。脚踏实地才可以跳一跳。

二则最重要的是,尝试新鲜不能迷失自己。要有自己的原则、方法和知识体系。不至于肤浅,盲目。就像我们中国人应该首先继承好自己的文化和历史,然后才能去借鉴别人新鲜的东西,否则危险。

说白了就是有根基的人才能创新(新鲜)。否则人云亦云,随波逐流,异想天开,终究会很疲惫,不知所措。越“努力”走得越远。

4.作为一个职员,你认为公司应该为发挥员工的“新鲜能力”提供怎样的环境或者做好哪些事情?

公司能经营好本行业务,整个公司和职员都不是每天为了生计疲于奔命。

5.你自己或者朋友的关于“新鲜能力”的故事?

没有。 

 

Python中的r = cond?x:y(转寄)

发信人: Black8 (⑧), 信区: Python
标 题: Python中的r = cond?x:y
发信站: 水木社区 (Tue Feb 7 22:47:08 2006), 转信

c语言中的这个语法,
如果cond=True,r = x 否则 r = y

在Python中有没有相应的表达方法?

我大概实验了一下,下面这个写法也可以:

r = cond and x or y

发信人: ghc (sunnavy), 信区: Python标 题: Re: Python中的r = cond?x:y发信站: 水木社区 (Tue Feb 7 23:12:16 2006), 转信
那样写不好,比如:

1?0:3 // get 01 and 0 or 3 # get 3

发信人: redhair (lolicon), 信区: Python标 题: Re: Python中的r = cond?x:y发信站: 水木社区 (Tue Feb 7 23:51:03 2006), 转信

r = (cond and [x] or [y])[0]

发信人: hotdog9 (每天爱你多一些), 信区: Python标 题: Re: Python中的r = cond?x:y发信站: 水木社区 (Wed Feb 8 10:25:54 2006), 转信

[y,x][bool(cond)]

Random posts

  • Setup Web.py and flup on Windows+Apache(WAMP)
  • 结婚照
  • 秃瓢
  • VOIP穿越防火墙笔记总结
  • 小小白满月