OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4119|回复: 4

在CubeF4 库上移植 uCOS-III的 几个问题

[复制链接]

68

主题

165

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2017-3-2
在线时间
156 小时
发表于 2017-3-2 20:31:29 | 显示全部楼层 |阅读模式
1金钱
我用官方的CubeMX软件通过CubeF4库生成了一个基本的模版,只配置了RCC相关的功能,在移植系统的时候,有四个问题想请教大家:

1、参照原子的资料,问题主要在uC提供的bsp.c上,原子的资料上说只保留BSP_CPU_ClkFreq这个函数,其他都删掉了,但是里面有个函数 BSP_Tick_Init 这个是初始化 systick系统定时器的,删掉这个是因为 HAL库也有这个函数的原因吗? 但是这个函数用到了 OS_CFG_APP.H 文件里的 OS_CFG_TICK_RATE_HZ 宏,如果把这个uC提供的函数删了,用HAL的函数,那么这个配置宏岂不是没用了?要设置systick的频率就只能直接在HAL库的函数里改了吧? 这块没太明白。有知道咋回事的吗?

2、我看了CubeMX生成的代码,在main函数里,调用了 HAL_Init  和 SystemClock_Config 函数,但是这两个函数里都有对 systick系统定时器的配置,这不是重复了吗,这么做具体有什么其他的含义吗?

3、system_stm32f4xx.c 这个文件里有个函数 SystemInit 应该是初始化时钟的吧,这个函数是在系统复位后在复位处理程序中调用的,这个函数和 刚才main函数中的系统时钟设置不也是重复的吗?不能在SystemInit 里面一次性设置完吗,为什么要重复设置系统时钟? 还有这个文件里定义了一个变量 SystemCoreClock,而且初始化为 16M,有个函数 SystemCoreClockUpdate 专门用于更新这个变量的,但是这个函数在 HAL库中有调用吗? 在main函数里的时钟初始化里也没看到这个更新时钟变量的函数,这个函数有啥用?

4、原子的资料里说如果应用中用到浮点单元,需要用汇编关闭浮点的惰性压栈功能,不明白为什么非得关闭惰性压栈功能,这个功能不是挺好的吗,反正惰性压栈时栈空间都是预留出来的,即便不入栈也没啥问题吧,还能提高任务切换速度。

最佳答案

查看完整内容[请看2#楼]

1、对于例程而言滴答定时器的初始化会通过delay_init()函数来完成,OS_CFG_TICK_RATE_HZ还有没有用全局搜索一下不就知道还有没有其他地方用到!据我所知,下图中红框地方用到了! systick怎么设置的,delay.c里面的delay_init()会完成设置,这个函数在基础例程的教程里面有详细的讲解。 2、HAL_Init()和SystemClock_Config()都配置了systick,那么最后配置的那个才有效,至于含义,你要是觉得重复了,或者多此一举了就删掉重复 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2017-3-2 20:31:30 | 显示全部楼层
本帖最后由 zuozhongkai 于 2017-3-2 21:02 编辑

1、对于例程而言滴答定时器的初始化会通过delay_init()函数来完成,OS_CFG_TICK_RATE_HZ还有没有用全局搜索一下不就知道还有没有其他地方用到!据我所知,下图中红框地方用到了!
2}%{DYM7YXUX@8A}%DGU0_8.png
systick怎么设置的,delay.c里面的delay_init()会完成设置,这个函数在基础例程的教程里面有详细的讲解。
2、HAL_Init()和SystemClock_Config()都配置了systick,那么最后配置的那个才有效,至于含义,你要是觉得重复了,或者多此一举了就删掉重复的!
3、你要是想的话可以在SystemInit()里面一次性把所有的时钟都配置好,但是一般情况下SysgtemInit()的实际配置可能和我的板子不一致,本着不随意修改ST官方库的原则,我宁愿自己重新编写一个时钟配置函数!SystemCoreClockUpdate()函数有没有在HAL库中调用,你自己全局搜索一下不就行了!!!!!!!!!!!!哪个文件、哪个地方调用了,一目了然!
4、你可以去把惰性压栈打开,打开以后麻烦请你测试一下浮点寄存器还能不能保存,任务中如果有用到浮点数的话系统会不会死机。UCOSIII新版本任务切换支持了浮点寄存器,但是根据官方的设置就要关闭惰性压栈,你也可以去修改,但是提醒你一句,修改以后测试一下任务中有浮点数的时候系统会不会死机。





开往春天的手扶拖拉机
回复

使用道具 举报

68

主题

165

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2017-3-2
在线时间
156 小时
 楼主| 发表于 2017-3-3 08:46:58 | 显示全部楼层
zuozhongkai 发表于 2017-3-2 20:59
1、对于例程而言滴答定时器的初始化会通过delay_init()函数来完成,OS_CFG_TICK_RATE_HZ还有没有用全局搜索 ...

谢谢版主~
关于第一个问题,你说的那个红框我之前也找到了,那个变量OSCfg_TickRate_Hz就是用在我说的那个uC提供的初始化函数BSP_Tick_Init  这个里面的,如果这个函数删了,貌似就没用了...
还有,你说的那个delay.c和 delay_init()不是ST和uC官方提供的吧,我在官方库里没找到...

最后还有个问题,就是最后一个,uCOS-III 3.04.04这个版本的对任务栈初始化的函数里对寄存器的入栈顺序好像和实际的不一样啊,实际的有浮点的应该是S0-S15先入栈然后是xPSR,PC LR R12 R3-R0 之后是R4-R11 最后是S16-S31,但是uC给的S0-S31直接放在最后了,这怎么回事?需要改吗?
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2017-3-3 09:37:27 | 显示全部楼层
delay.c和delay_init()是我们提供的,跟ST没有任何关系!关闭惰性压栈,浮点寄存器你想怎么入栈就怎么入栈
开往春天的手扶拖拉机
回复

使用道具 举报

68

主题

165

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2017-3-2
在线时间
156 小时
 楼主| 发表于 2017-3-3 10:03:09 | 显示全部楼层
zuozhongkai 发表于 2017-3-3 09:37
delay.c和delay_init()是我们提供的,跟ST没有任何关系!关闭惰性压栈,浮点寄存器你想怎么入栈就怎么入栈

好的 ,谢谢~
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 16:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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