找回密码
 立即注册
楼主: aa520520

8H8K上能否使用函数指针

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2024-12-28 19:16:55 | 显示全部楼层
LAO*** 发表于 2024-12-28 17:11
小系统不使用OS, 根本不存在需要维护调用树.
可 100% 的放心使用 函数指针.

不使用OS 就没问题吗?

不见得把。。

点评

函数指针 主要用在顶层到各个分支(任务) 散转 执行上. 在 不使用 OS上, 由于不存在 分支(任务) 的现场保护, 尽管 51存在众多的不可重入函数, 但都是依次执行完毕后(单核,只能依次执行), 才轮到进入 判断 函数指针  详情 回复 发表于 2024-12-29 07:24
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-04-01 23:18:33

15

主题

139

回帖

975

积分

高级会员

积分
975
发表于 2024-12-28 20:13:57 | 显示全部楼层
不是不能用,是有限制。

懂原理就明白什么时候该用,什么时候不该用。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:422
  • 最近打卡:2025-05-01 09:54:52
已绑定手机

19

主题

3190

回帖

4866

积分

论坛元老

积分
4866
发表于 2024-12-28 20:54:36 | 显示全部楼层
看视频Ai8051U教学视频不是都在用吗?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-04-01 23:18:33

15

主题

139

回帖

975

积分

高级会员

积分
975
发表于 2024-12-28 21:08:26 | 显示全部楼层
wnag*** 发表于 2024-12-28 21:03
能详细讲讲吗?我用过指针函数,没发现什么问题

具体问题具体分析吧。
请楼主详细讲一下,看了哪个帖子,出现了什么问题?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2024-12-29 07:24:49 | 显示全部楼层
_奶*** 发表于 2024-12-28 19:16
不使用OS 就没问题吗?

不见得把。。

函数指针 主要用在顶层到各个分支(任务) 散转 执行上.

在 不使用 OS上, 由于不存在 分支(任务) 的现场保护, 尽管 51存在众多的不可重入函数, 但都是依次执行完毕后(单核,只能依次执行), 才轮到进入 判断 函数指针 散转到 哪个分支(任务) 上,
因此, 除非你特意编写某个专用程序(目前我只想出, 在多个程序(函数)嵌套调用中, 最内层(底层)的函数, 执行函数指针散转任务, 由于 51存在众多的不可重入函数, 才会出错, 但这种写法, 没什么实用价值),
否则, 不会存在问题(有问题编译器会报警).
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:440
  • 最近打卡:2025-04-30 08:02:54
已绑定手机

4

主题

269

回帖

1246

积分

金牌会员

积分
1246
发表于 2024-12-29 09:05:59 | 显示全部楼层
aa52*** 发表于 2024-12-28 16:18
好的谢谢,如果是RAM单片机的话,函数指针就没问题的吧?

Keil C51中的函数指针和编译器有关系,它把函数参数和局部变量放到了寄存器中,没有放入堆栈。而且无相互调用的函数变量是共用寄存器的。例如A函数采用函数指针调用B函数,但编译器不知他们是调用关系,就会使A和B函数出现共用寄存器的情况,所以出现数据覆盖。并不是说使用函数指针就一定出现,只是存在这个可能性。所以还是要谨慎对待。

点评

不是寄存器, 无论 os 还是中断, 切换进入时都会先保护寄存器, 而是放在ram中的局部变量(非重入函数), 好处是程序精练, 缺点是回收分配必须依造调用树, 51把局部变量放在 堆栈中(重入函数), 不是做不到, 而是代价太  详情 回复 发表于 2024-12-30 19:37
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2024-12-29 10:40:39 | 显示全部楼层
LAO*** 发表于 2024-12-29 07:24
函数指针 主要用在顶层到各个分支(任务) 散转 执行上.

在 不使用 OS上, 由于不存在 分支(任务) 的现场保 ...

比如说中断中调用了某个函数指针的话 .....

点评

中断本身用于特定快速响应某些事件, 要求短小精干. 你把中断搞的很复杂, 哪怕 M0/M3 也要出问题. 51和 M0/M3 的主要区别, 就是函数的可重入性. 排除这一点, 51和 M0/M3 在 应用上, 区别不大.  详情 回复 发表于 2024-12-29 17:00
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-04-01 23:18:33

15

主题

139

回帖

975

积分

高级会员

积分
975
发表于 2024-12-29 15:47:34 | 显示全部楼层
一切源于C51和C251特有的参数传递和局部变量分配方式。

《Cx51 User's Guide》
Because of the limited stack space of the 8051, the linker overlays function variables and arguments in memory. When you use a function pointer, the linker cannot correctly create a call tree for your program. For this reason, you may have to correct the call tree for the data overlaying. Use the OVERLAY directive with the linker to do this.

《C251 User's Guide》
Because of the limited on chip RAM of the 251, the linker overlays function variables and arguments in memory. When you use a function pointer, the linker cannot correctly create a call tree for your program. For this reason, you may have to correct the call tree for the data overlaying. Use the OVERLAY directive with the linker to do this. Refer to the L251 Linker/Locater User's Guide for more information.

由于251的片上RAM有限,连接器在存储器中覆盖函数变量和参数。使用函数指针时,链接器无法正确创建程序的调用树。因此,您可能必须更正数据覆盖的调用树。对链接器使用OVERLAY指令来执行此操作。有关详细信息,请参阅《L251链接器/定位器用户指南》。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2024-12-29 17:00:47 | 显示全部楼层
_奶*** 发表于 2024-12-29 10:40
比如说中断中调用了某个函数指针的话 .....

中断本身用于特定快速响应某些事件, 要求短小精干.
你把中断搞的很复杂, 哪怕 M0/M3 也要出问题.
51和 M0/M3 的主要区别, 就是函数的可重入性.
排除这一点,  51和 M0/M3 在 应用上, 区别不大.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2024-12-30 08:51:46 | 显示全部楼层
LAO*** 发表于 2024-12-29 17:00
中断本身用于特定快速响应某些事件, 要求短小精干.
你把中断搞的很复杂, 哪怕 M0/M3 也要出问题.
51和 M0 ...

那也就是说除了 不用OS以外还是会出问题啊

点评

任何cpu 都有一定的编程规范, 比如固定地址寻址的特殊功能寄存器, 你在多个入口(如中断, OS) 程序 中, 去读写, 都会出问题.  详情 回复 发表于 2024-12-30 19:27
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 00:05 , Processed in 0.138003 second(s), 112 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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