lzzasd
发表于 2024-4-5 10:46:19
我用的就是这个 加个了任务看门狗
在运行任务完成才能切换 就是编程时注意下
神农鼎
发表于 2024-4-5 11:54:46
lzzasd 发表于 2024-4-5 10:46
我用的就是这个 加个了任务看门狗 在运行任务完成才能切换 就是编程时注意下
...
成功案例啊
xxxevery
发表于 2024-4-5 13:37:23
支持一下
tzz1983
发表于 2024-4-5 22:56:52
本帖最后由 tzz1983 于 2024-4-5 23:04 编辑
这个例子使用了函数指针, 函数指针是个好东西,
可是我不敢在keilC51, 或keilC251不开全局重入的时候用函数指针.
好像编译器调用树不能跟踪函数指针的调用.
以主题例程75来说,所有的任务函数都是在这调用的
打开map查看调用树,Task_Pro_Handler_Callback下面的调用树是空的.
我的理解是, keilC51要慎用函数指针, keilC251不开全局重入的时候也要慎用函数指针.
小型代码可能不会出问题, 代码大了就不好玩了, 手工指定调用树也很困难.
不知道我的理解是否正确?可以讨论一下
tzz1983
发表于 2024-4-6 08:55:41
全局可重入或 NOOVERLAY 是可解决,
应该把任务函数设为调用树顶层也可以,
我的意思是, 例子没有任何说明, 对于拿来主义,可能要犯错
主题例子还是一个比较简单的例子, 如果函数指针遍布整个项目,
那犯错机率就大了
还有就是这个例子也用于C51呀, 没有全局可重入选项,
NOOVERLAY代价太大, 同样的机制还不如函数名调用
fanxsp
发表于 2024-4-6 09:37:21
本帖最后由 fanxsp 于 2024-4-6 09:47 编辑
tzz1983 发表于 2024-4-5 22:56
这个例子使用了函数指针, 函数指针是个好东西,
可是我不敢在keilC51, 或keilC251不开全局重入的时候用函数 ...
使用函数指针,编译器无法正确理解调用关系,可以用链接指令来手工调整调用树,但是有点麻烦。
tzz1983
发表于 2024-4-6 09:51:36
fanxsp 发表于 2024-4-6 09:37
使用函数指针,编译器无法正确理解调用关系,可以用链接指令来手工调整调用树,但是有点麻烦。 ...
是的, 不适合新人, 还是直接用函数名调用比较容易
CosyOS
发表于 2024-4-6 11:59:36
的确,函数指针的问题应给予足够的重视,
应在使用说明中提示用户,并给出具体的解决方案供用户选择。
CosyOS 内核源码中大量使用了函数指针,
如定时中断钩子、定时查询钩子、中断挂起服务的执行函数等,
没有什么高明的方法,无非是 NOOVERLAY 或 全局可重入。
梁工
发表于 2024-4-6 12:57:10
tzz1983 发表于 2024-4-6 08:55
全局可重入或 NOOVERLAY 是可解决,
应该把任务函数设为调用树顶层也可以,
我的意思是, 例子没有任何说明,...
如果是同一个任务调用而中断不调用的函数,使用函数指针不需要特殊处理。
如果是占先内核不同优先级任务或中断都调用同一个函数,则要注意重入问题。
_奶咖君_
发表于 2024-4-8 11:01:07
CosyOS 发表于 2024-4-6 11:59
的确,函数指针的问题应给予足够的重视,
应在使用说明中提示用户,并给出具体的解决方案供用户选择。
Cosy ...
手动修改调用树,,我记得之前有个坛友在论坛里出过类似的问题。虽然不是使用系统出现的问题,,不过也是关于函数指针使用的,,帖子里面说了如何修改正确的调用树