当前位置: 首页 > news >正文

重庆网站建设红旗河沟沧州讯呗网络科技有限公司

重庆网站建设红旗河沟,沧州讯呗网络科技有限公司,wordpress侧浮动,实训小结网站建设自旋锁作用 自旋锁的是为了保护两个核上的公共资源,也就是全局变量,只有在一方也就是一个核抢到了自选锁,才能对公共资源进行操作修改,当然还有其他形似的锁如互斥锁,这里不比较两者的区别,以前没有深入的去…

自旋锁作用

      自旋锁的是为了保护两个核上的公共资源,也就是全局变量,只有在一方也就是一个核抢到了自选锁,才能对公共资源进行操作修改,当然还有其他形似的锁如互斥锁,这里不比较两者的区别,以前没有深入的去了解自旋锁的底层实现,只是简单调用。

自旋锁原理

     自旋锁的底层实现原理其实是用到了各个架构比较交换的汇编指令,英飞凌的TriCore架构为

CMPSWAP.W,ARM架构虽然没有比较交换指令,但是通过关闭preempt_disable禁止抢占来实现原子操作。

数据总线

      数据总线的一些基本概念这里就不提出来再讲了。有一个细节是在总线上同一时刻只能有一个主设备控制总线传输操作。而对于多核来说也是如此,他们需要互相争抢总线的使用权,而这一现象又能帮助我们实现一些原子操作。

总线操作

    使用总线对数据进行操作的时候并不是全部都能一次完成的,有时候可能需要多个操作才能实现我们编程中看似简单的操作,而在找个时候就不一定能满足我们的原子性了。

TriCore架构自旋锁实现

boolean IfxCpu_acquireMutex(IfxCpu_mutexLock *lock)
{boolean         retVal;volatile uint32 spinLockVal;retVal      = FALSE;spinLockVal = 1UL;spinLockVal =(uint32)__cmpAndSwap(((unsigned int *)lock), spinLockVal, 0);/* Check if the SpinLock WAS set before the attempt to acquire spinlock */if (spinLockVal == 0){retVal = TRUE;}return retVal;
}/** \brief This function is a implementation of a binary semaphore using compare and swap instruction* \param address address of resource.* \param value This variable is updated with status of address* \param condition if the value of address matches with the value of condition, then swap of value & address occurs.**/
IFX_INLINE unsigned int Ifx__cmpAndSwap (unsigned int volatile *address,unsigned int value, unsigned int condition)
{unsigned long long reg64= value | (unsigned long long) condition << 32;__asm__ __volatile__ ("cmpswap.w [%[addr]]0, %A[reg]": [reg] "+d" (reg64): [addr] "a" (address): "memory");return reg64;
}

   这段代码的逻辑及其简单,就是去查找我们lock变量的值是否为0,如果为0便把它赋值为1,并且返回成功抢到锁的信息。而有一个操作是值得关注的。__cmpAndSwap() 这一操作为什么能保证原子性并且能做到对变量进行加锁的呢?这里使用了汇编语言对芯片进行操作,而cmpswap.w操作正是我们在数据手册中找到的新指令。而正如注释说这一个指令能比较两个地址中的值是否相同,并完成交换。

   cmpswap.w等效如下代码:

tmp = *x;      //#tmp address的值
if(*x == z)       // # z为condition
{*x = y;    //#*address = values;
}
else
{*x = tmp;
}
return tmp

PowerPC架构自旋锁实现 

static inline uint32 aSpinlock_Hal_Swap(uint32 Addr, register uint32 Value)
{uint32 result;register uint32 temp1,temp2;__asm__ __volatile__(/* prepare the decoration for the SWAP instruction */"mr    %[temp11], %[Value]"        "\n"  /* load value in r6 */"e_lis    %[temp22], 0x5000"    "\n"  /* r5 = 0x50000000 */"se_or    %[temp11], %[temp22]"        "\n"  /* Value = Value | r5 *//* lwdcbx -> Load Word Decorated with Cache Bypass */"lwdcbx   %[result], %[temp11], %[Addr]"  "\n"  /* SWAP Addr with r3 */: [result] "=r" (result): [Addr] "b" (Addr), [temp11]"r" (temp1), [temp22]"r" (temp2) , [Value]"r" (Value): "cc");return result;
}

     参考文档:

  Aurix/Tricore实验分享之103: 硬件mutex指令|英飞凌开发者技术社区

  TriCore架构多核多线程锁探究(TC264双核互斥锁)-CSDN博客

   https://www.cnblogs.com/DoOrDie/p/9265754.html

http://www.yayakq.cn/news/649218/

相关文章:

  • 国外做的好点电商网站内网网站搭建设
  • 网站建设软著网站建设私单
  • 专业网页设计模板抖音seo怎么做的
  • 网站案例代码石景山网站制作案例
  • 网站规划怎么做学计算机哪个培训机构好
  • 建一个自己用的网站要多少钱承德名城建设集团网站
  • 关于电子商务网站建设的现状无锡企业网站制作哪家比较好
  • 免费的网站搭建前端课程网站
  • php mysql做网站登录建设网站的预期收益
  • 网站推广效益怎么分析网站建设的成本分析
  • 企业做定制网站的好处怎么做外国网站流量
  • 电影网站如何做seo江苏核酸检测机构
  • 自己做网站要买什么网络规划设计师考试资料百度云
  • 网站没有ftp 怎么推广php+mysql 2012也买酒商城网站源码
  • 沁阳建网站wordpress做x站主题
  • 长沙建设网站哪家好网站空间商 权限
  • 西部中大建设集团有限公司网站如何开公众号微信公众平台
  • 蕲春做网站重庆网站建设jccit
  • 网站建设的开发方式知乎公司网站要怎么做
  • 学做网站制作邮政招c1驾驶员8000元
  • 达州网站制作wordpress 计时
  • 上海正规做网站公司电话网站建设中提示页面下载
  • 建wiki网站这是我看过尺度最大的哔哩哔哩
  • 网站服务器错误怎么解决长沙外贸网站
  • 爱淘苗网站开发模式网站首页description标签
  • 高校建设人事处网站的意义建行app下载官网
  • wordpress页面如何设置新窗口打开百度seo优化推广公司
  • 网站如何建设目录结构新人如何自学做网站
  • 网站app用什么语言开发用ps怎么做网站背景
  • 百度网站推广申请网站建设收费明细