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

[复制链接]
6775|41
ayl439 发表于 2007-8-15 15:32 | 显示全部楼层

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

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

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

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

 
 
13楼的斑竹大大,我是新手,可是我看书上好象是只有中断函数才进行堆栈操作,是不是只要是函数调用都要进行堆栈操作那?
etual 发表于 2007-8-15 15:44 | 显示全部楼层

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

ayl439 发表于 2007-8-15 16:06 | 显示全部楼层

任何函数都是吗?

我知道中断会自动压入堆栈
但其他的普通函数也是吗?
用keil C的时候 中断的C函数是会产生入栈出栈的汇编语句的 但普通的函数确没有啊(自定义的非中断函数)
winloop 发表于 2007-8-15 16:55 | 显示全部楼层

to 18楼

这样的方式令人头痛:哪样的方式?
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
ayl439 发表于 2007-8-16 13:46 | 显示全部楼层

学习了~

学习了~
现在只用过51+C语言做非常小的项目~
古道热肠 发表于 2007-8-16 14:23 | 显示全部楼层

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

  从头到尾一目了然,不用跳来跳去,搞得办事效率低下。正式程序喜欢在Main()函数里首先让蜂鸣器叫一声,表示MCU开始干活了。
cuittao 发表于 2007-8-16 17:28 | 显示全部楼层

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

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

比较欣赏这种操作,当正式进入工作状态时,用串口往外发单字节标志性特殊字符(没有串口的系统不论)。
收到了,说明工作开始,该收到而没收到或收错了,说明当前系统有东西出错。
yewuyi 发表于 2007-8-16 17:39 | 显示全部楼层

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

这叫什么话?


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


NHH的理论……
cuittao 发表于 2007-8-16 17:46 | 显示全部楼层

我改过来了

不好意思,大意了,我改过来了
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里
  呵呵,随便说说。
computer00 发表于 2007-8-16 21:38 | 显示全部楼层

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

然后去对应的.h文件里面声明。
isbit 发表于 2007-8-16 22:02 | 显示全部楼层

hehe

我看的程序包里,变量在INT8U  imageTypes
PhotoView.h 里定义的,
然后好几个文件都有调用这个变量,(这些文件都#include “PhotoView.h”)
但是有几个文件声明为 extern INT8U  imageTypes
但是有几个没声明,不明白原因。
isbit 发表于 2007-8-16 22:39 | 显示全部楼层

标识一下

mindhen 发表于 2007-8-17 07:39 | 显示全部楼层

领教了!

编程格式真的很重要,学习了!
dcp 发表于 2007-8-17 08:12 | 显示全部楼层

建议睇下林锐的著作

古道热肠 发表于 2007-8-17 10:18 | 显示全部楼层

我赞同Computer00的变量处置风格

   变量在哪个C文件中起主导作用,就在这个C文件中定义,外部引用时作说明就行了。
ayb_ice 发表于 2007-8-17 10:57 | 显示全部楼层

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

John_Lee 发表于 2007-8-17 14:13 | 显示全部楼层

我的main只有一行

就是create一个task。
lshlin 发表于 2007-8-17 14:16 | 显示全部楼层

呵呵

我的main函数

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

我对全局变量的处理和圈圈有点像,放在.h里面定义、声明
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部