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

【经验分享】STM32H745 HSEM原理与使用

[复制链接]
STMCU小助手 发布时间:2021-12-29 23:00
简介
3 t+ I+ n8 c# `! U6 [9 KSTM32H745拥有Cortex-M7和Cortex-M4两个处理器单元,并提供了32个硬件semaphore(简称HSEM)用来控制双核之间或不同进程之间的同步。
! M" J+ e9 h  V6 c% G' V! R* q/ D. X$ B% M
HSEM原理8 p9 T9 i2 ~  i" r6 z7 h. G
每个HSEM都有一个32位的数值,它包含有3部分信息:锁标记位(bit:31),内核ID(bit:11-8),进程ID(bit:7-0),其它位为保留位。在FREE状态时,该HSEM数值为0,即锁标记位,内核ID和进程ID都为0。在LOCK状态时,锁标记位为1,内核ID由运行系统赋值(内核Cortex-M7为其赋值为3,内核Cortex-M4为其赋值为1),进程ID由用户赋值,其取值范围为0-255。
# ]# p4 H  |' i# A. {2 j; c* `: r; e9 v& e
当HSEM为LOCK状态时,只有相同的内核ID和进程ID才能对其解锁(RELEASE)。换句话说,由内核Cortex-M7上锁(TAKE)的HSEM,内核Cortex-M4无法对其解锁。即使同一内核内,进程1也无法对进程2解锁。
9 I' R' D7 F1 {" h6 X7 a$ f' e8 G
1 _) R! ~+ M: f! X' a3 c" Y若对已经为LOCK状态的HSEM上锁,如果内核ID或者进程ID不相同则上锁失败。如果两者都相同则上锁成功但不会改变当前HSEM的任何状态。6 [$ H0 z: S8 o5 g8 c9 G* r

  f. f  v# G+ O3 b5 z6 L+ q! KHSEM的上锁(TAKE)
6 y  S7 U2 z# z1 Q$ m6 I8 j每个HSEM支持两种的上锁方式:一种是写方式,另一种是读方式。对应于这两种方式,STM32提供了两种寄存器接口,一个是Rx,一个是RLRx,角标x是指对应的HSEM,从0到31。需要注意的是,尽管有两种方式和两个寄存器接口,但它们都对应着同一个HSEM。下面我们看一下两者的区别。
# z) n  \$ E. u0 S; h' ]! Y+ M
! k' t/ T8 D( r0 M4 E7 G, e, g4 q写方式% z* k9 \0 w9 u8 o0 t) b, K
它对应的HAL函数是;* Y: ]: b  u* a6 b' f5 W7 q% Z
HAL_StatusTypeDef HAL_HSEM_Take(uint32_t SemID, uint32_t ProcessID);
: l! t0 [3 W9 [  }1 W( f该函数对指定HSEM(SemID)写入进程ID(ProcessID)值,锁标记和内核ID。后两者是由函数内部赋值的。该函数内部对Rx寄存器赋值后,再读取其值以验证是否是要写入的值,如相等则表示写入成功,也即上锁成功,否则失败。可以看出这是通过写和读两个步骤完成的上锁功能。9 }% [/ s, J7 m1 v
4 R9 L  i( ~; C0 G- l9 O' P' K" S
读方式
2 b' h3 ]9 P7 w  ?( n1 E" h$ L) R7 Z* f此方式只用单步就可完成上锁功能。它对应的HAL函数是:& q4 g# a! m3 l" X$ \0 V8 B9 L
HAL_StatusTypeDef HAL_HSEM_FastTake(uint32_t SemID);8 x5 J4 @5 ~7 N/ Z- B
该函数内部只对指定HSEM(SemID)的RLRx寄存器做读操作。硬件内部判断如符合上锁条件,则会自动对其赋值,赋值内容有锁标记,内核ID和零值的进程ID。无论上锁是否成功,硬件都会返回该HSEM的值。函数的读操作就是判断HSEM值是否等于自身内核ID,如相等则表示上锁成功,否则失败。0 Z* k# J5 @. ~. Y0 d
可以看出读方式可一步完成上锁,但只能写入固定的进程ID值零。或者说这种方式更适用于两核之间的同步控制,或单进程的同步控制。而写方法需两步完成,但可写入用户指定的进程ID值,所以它即适用于两核之间,也适用于同核内部不同进程之间的同步控制。需要注意的是如果写方式指定的进程ID值是零,则与读方式写入的HSEM值是一样的。
& M4 `: Y+ R  v- y0 @. C: x
6 b: ]/ \2 q( E* WHSEM的解锁(RELEASE)
, j8 R3 f; E  q解锁对应的HAL函数是:
4 Q# T) K' x4 b9 fvoid HAL_HSEM_Release(uint32_t SemID, uint32_t ProcessID);% Z2 I# P) H; j4 n$ z. c
解锁是对指定HSEM(SemID)的Rx寄存器写入进程ID(ProcessID)值和内核ID,但不带锁标记。如解锁成功,HSEM值则被清零。此函数没有返回值。用户需使用另一个函数:
8 S2 c: L$ w6 Cuint32_t HAL_HSEM_IsSemTaken(uint32_t SemID);
5 P& U* z) q; T+ Y判断是否解锁成功。
+ g. `1 B& T, N1 q4 }; Y8 f
6 J! s( t' G$ x+ G' }! |另外STM32还提供一种可以给本内核内所有HSEM解锁的功能,条件是内核ID必须相符并且有一个预设的KEY值也必须相符。这是在系统崩溃时有用的一个功能。其内容比较容易理解,请参看芯片使用手册,这里就不赘述了。
! Y0 }. I7 x- H1 H5 a% d% T
2 N4 T) p" F. V4 b% nHSEM的中断通知
1 S5 A" i: [7 z7 b( {STM32H745为每个核都提供了一条HSEM中断线,用来为解锁产生中断通知。如果懂得中断处理这个也不难理解,请参看芯片使用手册,这里就不赘述了。2 I$ d0 }! w0 `; r% ]- |
+ g) @2 ^# d  }5 k$ K8 A" X

  ]% g+ a( B0 @/ a% Q6 w. g
收藏 评论0 发布时间:2021-12-29 23:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版