搜索
bottom↓
回复: 15

rtx中rt_free_box可以正常工作吗

[复制链接]

出0入0汤圆

发表于 2014-5-16 12:54:01 | 显示全部楼层 |阅读模式
这几天开始看rtx源码了,由浅入深,先看RT_MEMBOX.C这个固定内存大小分配模块

看到rt_free_box这个函数的实现如下
int rt_free_box (void *box_mem, void *box) {
  /* Free a memory block, returns 0 if OK, 1 if box does not belong to box_mem */
#ifndef __USE_EXCLUSIVE_ACCESS
  int irq_dis;
#endif

  if (box < box_mem || box >= ((P_BM) box_mem)->end) {
    return (1);
  }

#ifndef __USE_EXCLUSIVE_ACCESS
  irq_dis = __disable_irq ();
  *((void **)box) = ((P_BM) box_mem)->free;
  ((P_BM) box_mem)->free = box;
  if (!irq_dis) __enable_irq ();
#else
  do {
    *((void **)box) = (void *)__ldrex(&((P_BM) box_mem)->free);                        //此语句将在ldrex指令后,有个str指令,这不是破坏了互斥访问的基本条件吗???
  } while (__strex ((U32)box, &((P_BM) box_mem)->free));                                //这个条件永远都不会满足????
#endif
  return (0);
}


阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2014-5-26 13:17:16 | 显示全部楼层
本帖最后由 myxiaonia 于 2014-5-26 13:32 编辑
gzhuli 发表于 2014-5-26 01:24
不清楚,不过看ARM手册并没有说MRS读IPSR和CONTROL会产生fault,并且用MSR对PSR的EPSR和IPSR位段写入也确实 ...


还有个问题,这个_alloc_box 封皮函数中,当处于privilege模式时,也是直接执行了rt_alloc_box这个函数,请问这又是为什么

正常情况下,内核函数,要么已os做前缀,要么用isr做前缀,实质都是要陷入到中断去执行这些内核函数,以上privilege模式直接执行rt_alloc_box,没有在中断态执行,不知为何???

rt_alloc_box这个函数,我看看确实也没必要陷入中断的方法来执行,看其实现使用了互斥访问,mdk的手册也说其是reentrant和thread safe的,依我的看法用到互斥访问后自然是thread safe了,reentrant不知怎么理解,使用全局变量的函数怎么重入

出0入0汤圆

 楼主| 发表于 2014-5-18 21:12:16 | 显示全部楼层
本帖最后由 myxiaonia 于 2014-5-19 00:54 编辑

还有其他问题,才开始深入,就发现好多问题,看来这是个持久战啊。
  1. /*--------------------------- _alloc_box ------------------------------------*/

  2. __asm void *_alloc_box (void *box_mem) {
  3.    /* Function wrapper for Unprivileged/Privileged mode. */
  4.         LDR     R12,=__cpp(rt_alloc_box)
  5.         MRS     R3,IPSR
  6.         LSLS    R3,#24
  7.         BXNE    R12
  8.         MRS     R3,CONTROL
  9.         LSLS    R3,#31
  10.         BXEQ    R12
  11.         SVC     0
  12.         BX      LR

  13.         ALIGN
  14. }
复制代码

请问这里为何要用这个封皮,就是为了在中断里执行这个操作吗?直接svc陷入中断就可以了,何必还要判断是否已经发生中断,或者特权模式?

已经看懂若中断号存在则跳转,因为ipsr总是当前正在执行的中断,因此此处保证在异常模式执行跳转,这可能是为保证此函数在handler和thread模式都可运行,因为某些内核函数只能在其中之一的模式运行的(直接调用svc的函数就是,由于svc的不可屏蔽性)

那么特权模式也直接跳转是怎么回事,这个还是无法理解

出0入0汤圆

 楼主| 发表于 2014-5-21 07:49:29 | 显示全部楼层
rtx的内核函数,基本全都是用os或者isr作为前缀,用以区分在在任务和中断中分别执行的类型,os形式实质是isr同一个函数,无非是用svc的形式调用。。。。
唯独membox中的这几个函数特殊,难道是因为这几个函数会用来生成任务链表,在os内核形成前就需调用的缘故???

出0入0汤圆

 楼主| 发表于 2014-5-22 12:40:50 | 显示全部楼层
本帖最后由 myxiaonia 于 2014-5-22 12:45 编辑

rtx的membox内存块管理使用的数组链表形式,非常简洁。。。
最大的特点是用内存块首地址作为存放下个内存块地址的指针,更神奇的是这样多用途的做法在正确使用时不会造成混乱,即使已经分配的内存块首地址存放了数组链表的某些地址。。。
原因是从头节点开始的空闲链表不可能链接这个已分配内存块。。。
分配和释放也很干脆,直接从头节点处分配和释放,效率非常高,确实是很高明的思路


ucos好像也是用的相同的固定内存块管理方法

出0入0汤圆

 楼主| 发表于 2014-5-26 00:39:53 | 显示全部楼层
myxiaonia 发表于 2014-5-18 21:12
还有其他问题,才开始深入,就发现好多问题,看来这是个持久战啊。

请问这里为何要用这个封皮,就是为了在 ...

今天我拿板子进行硬件仿真了,发现thread+unprivilege模式下MRS指令访问ipsr和control寄存器竟然是有效,这是什么玩意这是


cm3权威指南 英文原版如是说
3.3  Opera TIOn M Ode
The Cortex-M3 processor supports two modes and two privilege levels (see Figure 3. 6).
When the processor is running in thread mode, it can be in either the privileged or user level, but
handlers can only be in the privileged level. When the processor exits reset, it is in thread mode, with
privileged access rights.
In  the  user  access  level  (thread  mode),  access  to  the  system  control  space  (SCS)—a  part  of  the
memory  region  for  configuration  registers  and  debugging  components—is  blocked.  Furthermore,
instructions that access special registers (such as MSR, except when accessing APSR) cannot be used.
If a program running at the user access level tries to access SCS or special registers, a fault exception
will occur

access  应该是读写的意思没问题吧,此书中文版翻译成访问,禁止MSR/MRS访问特殊功能寄存器,也就是读和写。。。。

但是实际情况来看  读操作根本没有禁止嘛。。。。读取是成功的,中文翻译者在此文处有译著

译注:原文的意思是越权访问一律产生fault( If a program running at the user access level tries
to access SCS or special registers, a fault exception will occur)。但译者使用Keil MDK开发环境
的模拟器和STM32 单片机作实验时却发现,对特殊功能寄存器越权访问时,仅忽略访问操作,并不产生fault 。另
外,译者发现,当使用模拟器时,即使访问了SCS 中的地址(译者使用的地址是 0xE000E100),模拟器竟然也允许
读写!后来译者又使用STM32 单片机来实验,STM32 单片机则的确产生了总线fault 并上访成了硬fault 。因此,如
果使用指令模拟器,则要小心。附:译者使用的MDK 版本号是 3.20


他实际操作的结果是忽略操作,那应该就是读写都忽略吗????

出0入0汤圆

 楼主| 发表于 2014-5-26 00:46:55 | 显示全部楼层
呼唤各路大神求救。。。。。。。

出0入663汤圆

发表于 2014-5-26 01:24:40 | 显示全部楼层
不清楚,不过看ARM手册并没有说MRS读IPSR和CONTROL会产生fault,并且用MSR对PSR的EPSR和IPSR位段写入也确实只是忽略,估计是直接MSR IPSR, Rn才会fault。

出0入0汤圆

 楼主| 发表于 2014-5-26 13:12:10 | 显示全部楼层
gzhuli 发表于 2014-5-26 01:24
不清楚,不过看ARM手册并没有说MRS读IPSR和CONTROL会产生fault,并且用MSR对PSR的EPSR和IPSR位段写入也确实 ...

ARMv7-M_ARM.pdf这个文档中,
没有说 读特殊功能寄存器将会忽略或者产生fault,倒是说写操作将会被忽略,从之前的实践来看,读特殊功能寄存器都是可以的,而且也确实是成功的。。。
arm的手册中多次提到unprivilege模式有limited access到特殊功能寄存器,可能就是这么个道理

出0入663汤圆

发表于 2014-5-26 13:22:53 | 显示全部楼层
myxiaonia 发表于 2014-5-26 13:17
还有个问题,这个_alloc_box 封皮函数中,当处于privilege模式时,也是直接执行了rt_alloc_box这个函数, ...

没研究过rtx,实在说不上来。

出0入0汤圆

 楼主| 发表于 2014-5-26 14:46:32 | 显示全部楼层
myxiaonia 发表于 2014-5-26 13:17
还有个问题,这个_alloc_box 封皮函数中,当处于privilege模式时,也是直接执行了rt_alloc_box这个函数, ...

wuzhujian大牛看看对这个问题有什么看法啊?

出0入0汤圆

 楼主| 发表于 2014-5-27 12:37:37 | 显示全部楼层
已经理解ldrex/strex这个互斥访问对,在隔壁坛上看到10年就有人问这个问题,香水城版主回复:ldrex锁定地址就是当前使用地址,这样以上互斥访问确实没有问题

出0入0汤圆

发表于 2014-5-27 13:04:32 | 显示全部楼层
可以这么理解的:
1> 执行ldrex时,内核从内存中读出内容,同时把它放在不可见的寄存器;
2> 执行strex时,也从该内存中读出内容,并与前一次保存的内容进行比较,如果一致,则写入新的内容,返回寄存器置0;如果不一致,不改变该内存的内容,返回寄存器置1。

出0入0汤圆

 楼主| 发表于 2014-5-27 13:16:24 | 显示全部楼层
wuzhujian 发表于 2014-5-27 13:04
可以这么理解的:
1> 执行ldrex时,内核从内存中读出内容,同时把它放在不可见的寄存器;
2> 执行strex时, ...

谢谢wuzhujian的回复,我搞明白这个互斥访问的机理并且也明白了在stm32中这个函数没有问题。。。

我接下来的问题是,用了互斥访问后,个人觉得这个封皮函数没有必要了,就是说rt_free_box不需要陷入中断来执行啊,完全可以在用户级程序运行就可以了,不知道这样理解对不对

出0入0汤圆

发表于 2014-5-27 14:23:54 | 显示全部楼层
你的理解是对的。
用封皮函数,就是为了进行线程切换。
不涉及到线程切换,可以不用。
只要保证是原子操作就行。

出0入0汤圆

 楼主| 发表于 2014-5-27 15:57:09 | 显示全部楼层
wuzhujian 发表于 2014-5-27 14:23
你的理解是对的。
用封皮函数,就是为了进行线程切换。
不涉及到线程切换,可以不用。

原来是线程切换用的。。。
还有个问题,封皮函数中,privilege模式下也是直接进入rt_free_box函数的,unprivilege我感觉也可以嘛,rt_free_box内部没有特殊的操作呀
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 06:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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