STMCU小助手
发布时间:2021-12-29 23:00
|
简介 STM32H745拥有Cortex-M7和Cortex-M4两个处理器单元,并提供了32个硬件semaphore(简称HSEM)用来控制双核之间或不同进程之间的同步。 % e B+ K+ U5 e HSEM原理 每个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。5 S S: ~$ G/ l/ D* T: K1 }8 M# p4 h & K. d0 N+ D9 x7 C: ?! D) Q2 p' t 当HSEM为LOCK状态时,只有相同的内核ID和进程ID才能对其解锁(RELEASE)。换句话说,由内核Cortex-M7上锁(TAKE)的HSEM,内核Cortex-M4无法对其解锁。即使同一内核内,进程1也无法对进程2解锁。; d1 N% j/ m' j, Q, f3 W2 }0 u 若对已经为LOCK状态的HSEM上锁,如果内核ID或者进程ID不相同则上锁失败。如果两者都相同则上锁成功但不会改变当前HSEM的任何状态。: |# ]0 W8 F1 u6 K( u2 N& g HSEM的上锁(TAKE) 每个HSEM支持两种的上锁方式:一种是写方式,另一种是读方式。对应于这两种方式,STM32提供了两种寄存器接口,一个是Rx,一个是RLRx,角标x是指对应的HSEM,从0到31。需要注意的是,尽管有两种方式和两个寄存器接口,但它们都对应着同一个HSEM。下面我们看一下两者的区别。6 W b t9 v* _, }5 F; P6 g # |/ l) {% ~$ v* H& j 写方式# z7 ~( i+ n2 L6 \3 g& Q 它对应的HAL函数是;4 j( G1 W1 a% T# y( c* v( a d8 M HAL_StatusTypeDef HAL_HSEM_Take(uint32_t SemID, uint32_t ProcessID); 该函数对指定HSEM(SemID)写入进程ID(ProcessID)值,锁标记和内核ID。后两者是由函数内部赋值的。该函数内部对Rx寄存器赋值后,再读取其值以验证是否是要写入的值,如相等则表示写入成功,也即上锁成功,否则失败。可以看出这是通过写和读两个步骤完成的上锁功能。: S7 A: T5 L( b# S) R: q8 b$ T : n* d( X! p' p1 K) m: |3 u 读方式0 x& v* C* t- F2 S: V' p" K: T 此方式只用单步就可完成上锁功能。它对应的HAL函数是:3 _( o5 s7 z7 x% u. u/ c9 ` HAL_StatusTypeDef HAL_HSEM_FastTake(uint32_t SemID); 该函数内部只对指定HSEM(SemID)的RLRx寄存器做读操作。硬件内部判断如符合上锁条件,则会自动对其赋值,赋值内容有锁标记,内核ID和零值的进程ID。无论上锁是否成功,硬件都会返回该HSEM的值。函数的读操作就是判断HSEM值是否等于自身内核ID,如相等则表示上锁成功,否则失败。 可以看出读方式可一步完成上锁,但只能写入固定的进程ID值零。或者说这种方式更适用于两核之间的同步控制,或单进程的同步控制。而写方法需两步完成,但可写入用户指定的进程ID值,所以它即适用于两核之间,也适用于同核内部不同进程之间的同步控制。需要注意的是如果写方式指定的进程ID值是零,则与读方式写入的HSEM值是一样的。 9 X2 E4 [. H5 `9 h J* j! m HSEM的解锁(RELEASE)5 P4 }: S8 A4 k9 ~& O 解锁对应的HAL函数是: void HAL_HSEM_Release(uint32_t SemID, uint32_t ProcessID); 解锁是对指定HSEM(SemID)的Rx寄存器写入进程ID(ProcessID)值和内核ID,但不带锁标记。如解锁成功,HSEM值则被清零。此函数没有返回值。用户需使用另一个函数:9 M( n5 {5 Z: _. _; P2 s {2 k uint32_t HAL_HSEM_IsSemTaken(uint32_t SemID);. `+ ^' e/ `( q u' Y 判断是否解锁成功。 另外STM32还提供一种可以给本内核内所有HSEM解锁的功能,条件是内核ID必须相符并且有一个预设的KEY值也必须相符。这是在系统崩溃时有用的一个功能。其内容比较容易理解,请参看芯片使用手册,这里就不赘述了。" v5 N) f8 O; U J- G0 G . R7 `, |% n( h* T, x, i HSEM的中断通知- f5 o/ {9 m) _9 T% b. f6 p9 r( S8 | STM32H745为每个核都提供了一条HSEM中断线,用来为解锁产生中断通知。如果懂得中断处理这个也不难理解,请参看芯片使用手册,这里就不赘述了。; g/ r' ~6 A+ X: ~ : ^8 O# z7 p8 f5 G& k" p e, u6 w |
【 逢7发帖赢大礼】1、利用CubeMX生成正点原子H7R7开发板的STM32CubeIDE工程
【STM32H735G-DK测评】ADC3+TIMER1+DMA 采样模拟信号
【STM32H735DK测评】Ethernet+lwip DHCP获取IP地址
STM32H743基于CubeMx5.0配置手册
【STM32H735G-DK测评】lvgl移植
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
【福利三:逢7发帖赢大礼】使用MPU6050模块、img_dsc、img_btn机制实现一些简单有趣的动画效果
【福利三:逢7发帖赢大礼】使用arc弧形拉条控件控制PWM舵机及使用SPI3接口操作NRF24L01模块进行无线通信
【福利三:逢7发帖赢大礼】调试nucleo-WBA65RI工程测试样板的一些心得
【福利三:逢7发帖赢大礼】lv_timer和BME680实现温度、湿度、气压数据读取
微信公众号
手机版