打印

运行函数和初始化函数共写问题

[复制链接]
2133|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ee168|  楼主 | 2009-11-6 15:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个中断函数(能加子程序的编译器),或其它只有一个入口的函数
可以这样
void funtion(void)
{
  if(初始化?)
  {
    funtion_run();
  }
  else
  {
    funtion_init();
  }
}
现在我想直接一点
void funtion(void)
{
  ... // 能否写成一个可改变的函数指针?在初始化状态和运行状态指向不同的地方
}

相关帖子

沙发
duojinian| | 2009-11-7 11:01 | 只看该作者
很多MCU的C编译器难以支持。

使用特权

评论回复
板凳
ee168|  楼主 | 2009-11-7 17:34 | 只看该作者
原来这么想的

int (*fun_do)(...)

fun_init(...)
{
  ...
  fun_do = fun_run;
}
fun_run(...)
{
  ...
}
void funtion(void)
{
  (*fun_do)(...)
}

在vc下遇到问题,在其它单片机编译器下还没有测试

使用特权

评论回复
地板
ee168|  楼主 | 2009-11-7 17:36 | 只看该作者
就算成功了,这种方法太麻烦,有点晦涩
处理时间未必短,特别是带参数的情况下需要再进行一次参数传递

使用特权

评论回复
5
原野之狼| | 2009-11-7 17:45 | 只看该作者
弄这么麻烦干嘛呢 没必要的
楼主赶紧送分吧,我还没赚到专家分呢~

使用特权

评论回复
6
ee168|  楼主 | 2009-11-7 20:34 | 只看该作者
怎么送,送给谁?

使用特权

评论回复
7
冷漠| | 2009-11-8 20:53 | 只看该作者
本帖最后由 冷漠 于 2009-11-8 20:55 编辑

看看书上函数指针部分:
void  fun_init(void);
void  funtion_run(void);
void (*fun_ptr[ ] ) (void)={ fun_init,  funtion_run };

调用时:
void funtion(char a)
{
    fun_ptr[a] ( );
    ......
}

使用特权

评论回复
8
ee168|  楼主 | 2010-1-31 19:52 | 只看该作者
结贴了,其实楼上的结果我也不太满意,如果这样和加变量判断没有什么区别,代码不会短,也时常要去判断,不过谢谢楼上实质上说了问题

使用特权

评论回复
9
ee168|  楼主 | 2010-1-31 20:10 | 只看该作者
本帖最后由 ee168 于 2010-1-31 20:15 编辑

typedef void (*pFun_t) (); // 声明函数指针类型
pFun_t  fun; // 声明函数指针变量

void funtion_init()
{
  // ......
  // 假如初始化正确
  fun = funtion_run;
}
void funtion_run()
{
  // .....
  // 假如出现需要重新初始化
  fun = funtion_init;
}

int main(void)
{
  // 系统初始化时
  fun = funtion_init;

  while(1)
  {
     fun();
  }
}

没有用编译验证,验证完毕后再来报结果

使用特权

评论回复
10
ee168|  楼主 | 2010-1-31 20:24 | 只看该作者
本帖最后由 ee168 于 2010-1-31 20:28 编辑

想一想,2楼说的有些道理的,有些编译器是不支持的,因为最后fun函数的调用是从ram中取的

我估计51系统的就不会支持,因为51系统地址不统一,对flash和ram有不同的访问指令.不能在flash,和ram中跨段调用
avr的呢?

我所知道freescall是统一地址的, flash,ram,eeprom有统一连续的地址,能跨段调用不知道行不行

还没有细想,欢迎指导

使用特权

评论回复
11
ee168|  楼主 | 2010-1-31 20:51 | 只看该作者
我想起来了,AVR(winavr编译器)的可以,但怎么实现的呢?

使用特权

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

本版积分规则

114

主题

200

帖子

2

粉丝