ST意法半导体
直播中

张秀兰

7年用户 1267经验值
私信 关注
[问答]

有没有办法定义函数 f() 以便一个参数 p 接受 uint8_t * 和 __IO uint8_t * 参数?

这个问题有点天真,但是有没有办法定义函数 f() 以便一个参数 p 接受 uint8_t * 和 __IO uint8_t * 参数,即函数 f() 写入内部 SRAM 或外部 SDRAM,具体取决于指针通过了吗?
例如,我需要写什么来代替 _______?
  • void memset(_____ *p, char x, unsigned count)
  • {
  •     while (count--)
  •         *p++ = x;
  • }
  • __IO uint8_t *q = ...;
  • memset(q, 'a', 10);
  • uint8_t *r = ...;
  • memset(r, 'b', 10);
如果我必须两次实现相同的功能,每种内存类型一次,那将是相当浪费的。








回帖(1)

李秀兰

2023-2-7 10:20:44
> 如果是这样,为什么对常规 SRAM 的访问不是易失性的?
使用 volatile 的原因取决于您的程序对内存的使用,而不是内存本身。如果您只在主循环中访问内存,并且中断不接触它,则无需使用 volatile,无论内存类型如何。如果可以在中断内更改内存,并且您希望主循环在每次访问时重新读取该寄存器,则需要使用 volatile 来防止编译器对其进行优化。
> 我仍然不知道为什么 ST 引入了 __IO 东西(除了添加 volatile 之外)?定义中提到“读/写权限”,但没有人检查这个?!
__IO 没有什么可强制执行的。除了读取或写入寄存器外,您不能做任何事情。
使用 const 将定义为 __I 的寄存器强制为只读。不确定为什么它在 C++ 中与在 C 中不同。
定义为 __O 的寄存器不能强制为只写,因为 C 中没有这样的限制。


  • #ifdef __cplusplus
  •   #define   __I     volatile             /*!< Defines 'read only' permissions */
  • #else
  •   #define   __I     volatile const       /*!< Defines 'read only' permissions */
  • #endif
  • #define     __O     volatile             /*!< Defines 'write only' permissions */
  • #define     __IO    volatile             /*!< Defines 'read / write' permissions */
举报

更多回帖

发帖
×
20
完善资料,
赚取积分