打印

做单片机很多年, 还是在制作着庞大的 main()

[复制链接]
楼主: AIRWILL
手机看帖
扫描二维码
随时随地手机跟帖
21
ayl439| | 2007-8-15 15:32 | 只看该作者 回帖奖励 |倒序浏览

只要是函数调用都要进行堆栈操作?

救火车 发表于 2007-8-15 09:20 侃单片机 ←返回版面    

13楼: 不同意11楼的写法。 

void main(){
    sys_init();
    while(1){
        do_work();
    }
}
主程序写成do_work();白白浪费了一次函数调用。在每次循环中都要进栈出栈操作。浪费了堆栈和操作的时间。而且没有任何意义。

 
 
13楼的斑竹大大,我是新手,可是我看书上好象是只有中断函数才进行堆栈操作,是不是只要是函数调用都要进行堆栈操作那?

使用特权

评论回复
22
etual| | 2007-8-15 15:44 | 只看该作者

函数调用的时候是需要将PC压进去堆栈的

使用特权

评论回复
23
ayl439| | 2007-8-15 16:06 | 只看该作者

任何函数都是吗?

我知道中断会自动压入堆栈
但其他的普通函数也是吗?
用keil C的时候 中断的C函数是会产生入栈出栈的汇编语句的 但普通的函数确没有啊(自定义的非中断函数)

使用特权

评论回复
24
winloop| | 2007-8-15 16:55 | 只看该作者

to 18楼

这样的方式令人头痛:哪样的方式?

使用特权

评论回复
25
etual| | 2007-8-16 10:28 | 只看该作者

to 23楼

to 23楼
用 call 来函数调用函数是必须压堆栈的。发生函数调用的时候,先将PC压进去堆栈,然后将函数的入口地址装载进去PC 指针,从而跳转函数入口地方执行。
从而ret指令返回的时候能正确的装载PC,回到原来调用函数之前的地方。当然,你也可以用JMP指令代替call指令来执行子程序,JMP回来原先的地方就可以了,哈哈。
中断跟这个原理是一样的,PC指针也是必须压入堆栈的,这个跟 psw , acc 等手动 push 进去堆栈是不同的,PC指针是单片机自己压进去的,不用干预。
另外,正是因为PC指针被压进去堆栈,操作系统的多任务切换才能成为可能,嘿嘿~~~ 
51用RAM 作为堆栈区,所以多一个少一个堆栈没有啥问题的,如果以后有基会用用PIC 的话,就知道堆栈资源多么的宝贵了 ... orz
学习C语言的同时学学汇编还是有好处di

使用特权

评论回复
26
ayl439| | 2007-8-16 13:46 | 只看该作者

学习了~

学习了~
现在只用过51+C语言做非常小的项目~

使用特权

评论回复
27
古道热肠| | 2007-8-16 14:23 | 只看该作者

main()函数写测试程序最方便

  从头到尾一目了然,不用跳来跳去,搞得办事效率低下。正式程序喜欢在Main()函数里首先让蜂鸣器叫一声,表示MCU开始干活了。

使用特权

评论回复
28
cuittao| | 2007-8-16 17:28 | 只看该作者

呵呵,如果没有蜂鸣器怎么办?

呵呵,如果没有蜂鸣器怎么办?

比较欣赏这种操作,当正式进入工作状态时,用串口往外发单字节标志性特殊字符(没有串口的系统不论)。
收到了,说明工作开始,该收到而没收到或收错了,说明当前系统有东西出错。

使用特权

评论回复
29
yewuyi| | 2007-8-16 17:39 | 只看该作者

(没有串口的极小系统不论)

这叫什么话?


有串口就是大系统,没串口就是小系统?


NHH的理论……

使用特权

评论回复
30
cuittao| | 2007-8-16 17:46 | 只看该作者

我改过来了

不好意思,大意了,我改过来了

使用特权

评论回复
31
isbit| | 2007-8-16 19:34 | 只看该作者

把程序分块后,变量放在哪里好呢?

  一个项目譬如分成多个文件。
  key。c
  key.h
 
 dislcd.c
 dislcd.h
 
 uart.c
 uart.h
那么变量
  1:放在分开放在。c里好呢,
  2:还是放在。h里,------想这样放,但是多个文件包含,就会重复定义。
  3:还是干脆放在一个 mydata。h里
  呵呵,随便说说。

使用特权

评论回复
32
computer00| | 2007-8-16 21:38 | 只看该作者

变量定义分开放,属于什么功能的,就放哪个.c。

然后去对应的.h文件里面声明。

使用特权

评论回复
33
isbit| | 2007-8-16 22:02 | 只看该作者

hehe

我看的程序包里,变量在INT8U  imageTypes
PhotoView.h 里定义的,
然后好几个文件都有调用这个变量,(这些文件都#include “PhotoView.h”)
但是有几个文件声明为 extern INT8U  imageTypes
但是有几个没声明,不明白原因。

使用特权

评论回复
34
isbit| | 2007-8-16 22:39 | 只看该作者

标识一下

使用特权

评论回复
35
mindhen| | 2007-8-17 07:39 | 只看该作者

领教了!

编程格式真的很重要,学习了!

使用特权

评论回复
36
dcp| | 2007-8-17 08:12 | 只看该作者

建议睇下林锐的著作

使用特权

评论回复
37
古道热肠| | 2007-8-17 10:18 | 只看该作者

我赞同Computer00的变量处置风格

   变量在哪个C文件中起主导作用,就在这个C文件中定义,外部引用时作说明就行了。

使用特权

评论回复
38
ayb_ice| | 2007-8-17 10:57 | 只看该作者

我喜欢所有的全局变量定义和声明一次搞定。。。

使用特权

评论回复
39
John_Lee| | 2007-8-17 14:13 | 只看该作者

我的main只有一行

就是create一个task。

使用特权

评论回复
40
lshlin| | 2007-8-17 14:16 | 只看该作者

呵呵

我的main函数

int main(void)
{
    os_sys_init (sys_init_task);
}

我对全局变量的处理和圈圈有点像,放在.h里面定义、声明

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则