D语言中ARM架构中CRC寄存器的操作

D语言中CRC寄存器的操作

  • 代码范例

/**********************
   寄存器方式处理CRC32
*       CRC.IDR 寄存器作为调用计数器进行使用,请勿复用这个寄存器 最高位为busy指示.
参数:

返回: 
   uint
范例:
--------------------
auto hash = crc32of(1,&buf);
--------------------
   bug: 
*       调用计数超 0x7F 会溢出;
*       采用atomic库存储,可能会存在问题,这个问题还不确认
*/
auto crc32of(size_t len,scope const(uint*) src)
{
   import mculib.arch.support;
   //
   enum BitsSize = CRC.IDR.IDR.Bits_Type.sizeof*8;
   // 忙位
   enum ubyte Busymask = 1u << (BitsSize - 1);

   enum unBusymask = MakerMask4Slice!(0,BitsSize-1);

   //pragma(msg,"Info:",(unBusymask));
   // IDR寄存器访问
   enum shared(ubyte)* mIDR = cast(shared(ubyte)*)(CRC.IDR.RegistersAddress);

   // 判定CRC使能,如手动开启则不做关闭判定
   if(!RCC.AHB1ENR.CRCEN.value){
       scope(exit){
           if(*mIDR == 0x00){
           // 判定调用计数器归零后关闭使能
           //if(CRC.IDR.IDR.value == 0){
               // 离开域时复位CRC时钟原始状态
               RCC.AHB1ENR.CRCEN.value = 0;
           }
       }
       // 开启CRC时钟使能
       RCC.AHB1ENR.CRCEN.value = 1;
       // 复位CRC
       //CRC.CR.CR.value = 1;
       // 复位CRC调用计数器
       *mIDR = 0x00;
   }
   // 
   ubyte oldIdr = 0;
   ubyte newIdr = 0;

   // 增加调用计数
   do{
       oldIdr = atomicLoad(*mIDR);
       newIdr = oldIdr ;
       newIdr++;
   }while(!cas(mIDR,oldIdr,newIdr));

   // 标记忙
   do{
       oldIdr = atomicLoad(*mIDR) & unBusymask;
       newIdr = oldIdr | Busymask;
   }while(!cas(mIDR,oldIdr,newIdr));

   // 离开时更新计数器 同时释放busy标记
   scope(exit){

       do{
           oldIdr = atomicLoad(*mIDR) & unBusymask;
           newIdr = oldIdr ;
           newIdr --;
       }while(!cas(mIDR,oldIdr,newIdr));
   }
   
   // 寄存器操作复位
   CRC.CR.CR.value = 1;
   
   /*
   foreach (v; data)
   {
       CRC.DR.value = v;
   }*/
   auto ptr = cast(uint*)src;
   while(len--){
       CRC.DR.value = *ptr++;
   }
   
   return CRC.DR.value;
}
  • 重点:
    小心中断,尽可能不在中断内调用任何函数,中断内调用函数会涉及到不少烦心事情的
    操作寄存器时需要考虑寄存器的准备时间,尽量调用后核对一下状态或用提交刷新一下内存
    文章内没有实现代码的函数可以在 https://gitee.com/sdvcn/mculib4d 内查阅到相关代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值