gongkongzidongh 发表于 2019-2-5 13:33:28

如何在系统节拍中断函数中加入自己的代码

   大家新年好,今天大年初一我有个问题想要请教一下,目前我在使用KEIL自带的RTX操作系统,处理器用的是STM32F0,操作系统用的是滴答定时器现在我想在滴答定时器中断函数中加入一些自己的代码,但不知道这个中断函数到底在哪?还有就是这个系统定时器的中断优先级是多少?该如何设置?

eric2013 发表于 2019-2-5 15:03:46

1.HAL_CMx.c
2.RT_HAL_CM.H

sanit 发表于 2019-2-5 15:10:13

这个优先级默认是最低优先级,设置的话好像在HAL_CMX.C

gongkongzidongh 发表于 2019-2-5 15:25:27

eric2013 发表于 2019-2-5 15:03
1.HAL_CMx.c
2.RT_HAL_CM.H

我用的是M0+KEIL4.74,用的是自带内核并不是移植的源码,然后KEIL的RTX目录下只有HAL_CM1/3/4.c和RT_HAL_CM.h,并没有HAL_CM0.c,不过我测试了RTX创建的任务都可以正常运行,然后需要将这两个文件复制到自己的工程目录下吗?然后任务节拍定时器代码是不是汇编写的?

gongkongzidongh 发表于 2019-2-5 15:27:12

sanit 发表于 2019-2-5 15:10
这个优先级默认是最低优先级,设置的话好像在HAL_CMX.C

我用的是M0,KEIL目录下并没有HAL_CM0.c这个文件,不过目前任务都可以正常运行。

eric2013 发表于 2019-2-8 10:39:08

gongkongzidongh 发表于 2019-2-5 15:25
我用的是M0+KEIL4.74,用的是自带内核并不是移植的源码,然后KEIL的RTX目录下只有HAL_CM1/3/4.c和RT_HAL_ ...

HAL_CM0后面的新版里面已经添加了,将此贴里面的复制出来使用即可:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=86696&extra=page%3D1%26filter%3Dtypeid%26typeid%3D164

gongkongzidongh 发表于 2019-2-8 13:00:01

eric2013 发表于 2019-2-8 10:39
HAL_CM0后面的新版里面已经添加了,将此贴里面的复制出来使用即可:
http://www.armbbs.cn/forum.php ...

好的,谢谢

公仆 发表于 2019-2-17 20:00:47

keil-mdk有一个很好的机制,用于没有源码的条件下,修改库里的函数的行为。
比如,在自己的c文件中加入如下代码就能实现你的目的(TICK_Exec函数是你自己的函数)
////////////////////////////////////////////////////////////////////////////////
//|          |
//| 函数名称 |: rt_tmr_tick
//| 功能描述 |: 在RTX中,每tick都会调用rt_tmr_tick函数;
//|          |: 所以利用armlink的挂钩特性,用于执行我们的tick服务
//| 参数列表 |:
//|          |:
//| 返    回 |:
//|          |:
//| 备注信息 |: $Super$yourfunc 成为原先的函数标号。
//|          |: $Sub$yourfunc   改造后的函数标号,替代原来的yourfunc标号。
//|          |:
//|          |: (要注意rt_tmr_tick()是在tsk_lock()情况下执行的)
////////////////////////////////////////////////////////////////////////////////
extern void $Super$rt_tmr_tick(void);
void $Sub$rt_tmr_tick(void)
{
$Super$rt_tmr_tick();
TICK_Exec();
}

公仆 发表于 2019-2-17 20:01:44

$Super$和$Sub$机制的具体信息,在mdk帮助文档里有详细说明。

myxiaonia 发表于 2019-2-20 15:10:17

公仆 发表于 2019-2-17 20:01
$Super$和$Sub$机制的具体信息,在mdk帮助文档里有详细说明。

又学到新知识了,我记得st的标准库用的是__weak指令

而且我还记得即使没有__weak指令,只要你写的代码文件在链接的时候在库的前面,也是链接你自己的代码

公仆 发表于 2019-2-22 16:33:34

myxiaonia 发表于 2019-2-20 15:10
又学到新知识了,我记得st的标准库用的是__weak指令

而且我还记得即使没有__weak指令,只要你写的代码 ...

这个挂钩机制跟weak不一样;weak是以f2替换f1函数,而挂钩是f2既可以替换,又可在函数体内再次调用f1。这样就能让用户定制lib里的函数行为了。

公仆 发表于 2019-2-22 16:36:06

公仆 发表于 2019-2-22 16:33
这个挂钩机制跟weak不一样;weak是以f2替换f1函数,而挂钩是f2既可以替换,又可在函数体内再次调用f1。这 ...

比如某个lib里的函数f1,没有对参数进行校验;可以利用挂钩机制写f2函数,对参数校验后再调用f1。于是原来的f1函数就具有了参数校验的功能。其它任何代码都不用修改。

公仆 发表于 2019-2-22 16:37:32

公仆 发表于 2019-2-22 16:36
比如某个lib里的函数f1,没有对参数进行校验;可以利用挂钩机制写f2函数,对参数校验后再调用f1。于是原 ...
再比如,keil的C库不是开源的;这时就可以利用挂钩函数定制启动代码的行为,可以改变C++库里的静态对象的构造器执行时机。

公仆 发表于 2019-2-22 16:40:11

myxiaonia 发表于 2019-2-20 15:10
又学到新知识了,我记得st的标准库用的是__weak指令

而且我还记得即使没有__weak指令,只要你写的代码 ...

你看帖子还比较仔细。
我这个回复没有几个人会重视。这么好的功能很多人都不知道呢!

myxiaonia 发表于 2019-2-23 09:28:26

公仆 发表于 2019-2-22 16:40
你看帖子还比较仔细。
我这个回复没有几个人会重视。这么好的功能很多人都不知道呢!

确实不太一样,尤其是还能再次调用原来的函数,这一点让人印象深刻,我还按照你的指引去mdk帮助文档学习了一番,那里说的也比较简单,你的回复很详细了,不看帮助文档都没问题

可能是这个知识点比较偏,大多数人用不到,但是确实是个值得学习的知识。。。


__weak还有个好处是,如果声明函数原型是__weak,那么显示调用这个函数,即使没有原型也不会报错,也是一个很有特色的做法

gongkongzidongh 发表于 2019-2-28 19:36:11

公仆 发表于 2019-2-17 20:00
keil-mdk有一个很好的机制,用于没有源码的条件下,修改库里的函数的行为。
比如,在自己的c文件中加入如 ...

非常感谢。

soga238 发表于 2019-3-6 09:04:13

学到了,一般用weak

gongkongzidongh 发表于 2019-3-9 14:59:25

公仆 发表于 2019-2-17 20:00
keil-mdk有一个很好的机制,用于没有源码的条件下,修改库里的函数的行为。
比如,在自己的c文件中加入如 ...

编译提示未定义,是不是还需要声明? .\obj\stm32f0.axf: Error: L6218E: Undefined symbol $Super$rt_tmr_tick (referred from run.o).

公仆 发表于 2019-3-9 22:48:49

gongkongzidongh 发表于 2019-3-9 14:59
编译提示未定义,是不是还需要声明? .\obj\stm32f0.axf: Error: L6218E: Undefined symbol $Super$rt_tm ...

别用源码版本,这个机制是针对lib版本的。另外,如果是ARM7/9的版本,是没有rt_tmr_tick函数的。

gongkongzidongh 发表于 2019-3-9 23:30:32

公仆 发表于 2019-3-9 22:48
别用源码版本,这个机制是针对lib版本的。另外,如果是ARM7/9的版本,是没有rt_tmr_tick函数的。

我是用的KEIL库,芯片是STM32
页: [1]
查看完整版本: 如何在系统节拍中断函数中加入自己的代码