你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm 8 flash 在RAM运行代码的问题,是不是库函数有问题 Library call (?sll32_l0_l0_a) from within a

[复制链接]
wlw129 提问时间:2023-10-24 18:55 / 未解决
收藏 评论10 发布时间:2023-10-24 18:55

举报

10个回答
butterflyspring 回答时间:2023-10-25 10:04:28
从手册上看,最大的地址范围也没有到32位,况且STM8也没有32位寄存器,所以无法实现32位寻址。
小于32k 的16位地址即可,32-128K的24位地址即可

STM8 MEMORY ADD2 32K.PNG STM8 MEMORY ADD 128K.PNG
STMCU-管管 回答时间:2023-10-25 08:38:53
一般来说,将代码从Flash运行到RAM可能涉及到地址映射、函数调用和数据访问等方面的处理。有没有其他更多提示看看呢
wlw129 回答时间:2023-10-25 09:00:42

STMCU-管管 发表于 2023-10-25 08:38
一般来说,将代码从Flash运行到RAM可能涉及到地址映射、函数调用和数据访问等方面的处理。有没有其他更多提 ...

我怀疑是库函数问题,希望官方指导一下,把地址内存改为16位就不会出现告警

wlw129 回答时间:2023-10-25 09:06:52

STMCU-管管 发表于 2023-10-25 08:38
一般来说,将代码从Flash运行到RAM可能涉及到地址映射、函数调用和数据访问等方面的处理。有没有其他更多提 ...

IN_RAM 已经宏定义_ramfunc 了,但是运行到 Startaddress = startaddress + ((uint32_t)BlockNum * FLASH_BLOCK_SIZE)里显示有非_ramfunc 的函数 这里 Startaddress 定义的 32位,尝试把他改为16位不会出现告警,这里定义的32位是不是针对STM8_HD的产品型号?我用的MD的改为16位是否可以

wlw129 回答时间:2023-10-25 10:13:17

butterflyspring 发表于 2023-10-25 10:04
从手册上看,最大的地址范围也没有到32位,况且STM8也没有32位寄存器,所以无法实现32位寻址。
小于32k 的1 ...

感谢回答,是不是库函数这一块有bug,用的stm8L151k6 flash最大32K,不明白为什么转成32位运算,能直接修改吗,

butterflyspring 回答时间:2023-10-25 11:59:44
这个库函数用了十多年了,应该没什么问题。

函数前面有说明,对于IAR的一些警告是没影响的。

所以不用纠结这警告

Stm8l lib about the expian for ram.PNG
xmshao 回答时间:2023-10-25 12:00:01

不知你所说的告警具体是什么。有些时候警告只是提醒未必是错误。

首先,这个地方的变量startaddress定义为32位是合理的也是必要的,STM8的最大寻址空间为18MB.

作为库代码,它要兼顾整个系列。

STM8支持3种寻址模式,即短寻址、长寻址和扩展寻址模式,分别对应8位地址空间、16位地址空间和整个

18MB地址空间。而且,对于8位地址寻址模式和16位寻址模式还需遵循256B和16KB地址对齐,即8位寻址模式

不是任意的8位地址空间,16位寻址模式也非任意的16位地址空间。

既然这样,具体到你提到的当前计算结果startaddress,在基于它寻址时我们需要给它指定合适的指针类型,

或说指针属性,到底是16位长模式访问 还是24位扩展模式访问,亦即代码里提到的near 还是 far属性。

不过,强烈不建议你研究这个STM8芯片了。看看STM32 M0或M0+内核的芯片吧** ,比方STM32C0,

STM32F0,STM32G0啊,低功耗还有STM32L0啊这些。

wlw129 回答时间:2023-10-25 14:18:02

butterflyspring 发表于 2023-10-25 11:59
这个库函数用了十多年了,应该没什么问题。</p>
<p>函数前面有说明,对于IAR的一些警告是没影响的。

非常感谢你的细心回答,具体告警是

Library call(?sll32_IO_IO_a)from within a _ramfunc function以及

Library call(?add32_IO_IO_l1)from within a_ramfunc function是出现在 startaddress = staraddress + ((uint32_t)BlockNum * FLASH_BLOCK_SIZE 语句里。 尝试只有把staraddress定义为uint16_t 告警才会消除,现在是不知道这个告警对功能有没有影响,因为有时发现存到模拟EEPROM的数据会丢失,所以怀疑这个告警说明程序本身还是有问题。 另外我的意思是针对不同的型号可以用宏定义隔开,不是说不让支持大容量型

butterflyspring 回答时间:2023-10-27 14:47:06
wlw129 发表于 2023-10-25 14:18
[md]非常感谢你的细心回答,具体告警是

Library call(?sll32_IO_IO_a)from within a _ramfunc function ...

如同上面那么小伙伴所说,STM8的寻址空间分为16 位和24 位。

而 STM8 是没有32位寄存器,这就让编译器很难办,实际执行也不好说。

之前对寻址范围是靠关键字定义来区分的,通过 @near   or   @ far 来告诉编译器并提高效率的。
编译器还有给默认配置的寻址模式


不过对于内部EEPROM来说,就是16位寻址范围,可以参考手册对于地址范围的描述。
wlw129 回答时间:2023-10-30 14:43:01

butterflyspring 发表于 2023-10-27 14:47
如同上面那么小伙伴所说,STM8的寻址空间分为16 位和24 位。</p>
<p>而 STM8 是没有32位寄存器,这就让编译器很 ...

好的,谢谢

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版