linux脚本位运算,shell脚本之位运算+for循环+返回值承接(示例代码)

用shell脚本实现某个寄存器的某几位设置

坑位1:

开发板上不认(ubuntu上可以)

for (( i=0;i<6;i++ ))

do

done

换成:

for i in `seq 0 6`

do

done

坑位2:

返回值承接用#?时默认只截取低8位

setbits $1 $2 $3 $4

regv=$?

printf "regv= %#x\n" $regv

发现只剩低八位

所以,换种承接方式吧:

regv=`regread $1`

这种方式是直接将命令执行或在屏幕上输出的东西接过来,是字符串。

坑位3:

如上面,reg=`regread $1`得到的字符串若用printf  "%d" 是打印不到的,直接echo才行

坑位4:

reg=setbits $1 $2 $3 $4 这种方式来承接会爆语法错误,不是C语言。

最终测试成功,如下:

#######################################################

# test the sar-adc in SOC

#######################################################

regwrite()

{

devmem $1 32 $2

}

regread()

{

devmem $1

}

##argv[1] :origin data

##argv[2] :start bit

##argv[3] :end bit

##argv[4] :result

setbits()

{

value=$1

for i in `seq $2 $3`

do

mask=$(( 0x1 << $i ))

#printf "mask = %#x\n" $mask

value=$(( $value & ~$mask ))

#printf "clean bit %d value = %#x\n" $i $value

mask1=$(( 0x1 << ($i - $2) ))

#printf "mask1 = %#x\n" $mask1

bitv=$(( $4 & mask1 ))

#printf "bitv = %#x\n" $bitv

value=$(( $value | ($bitv << $2) ))

#printf "set bit %d value = %#x\n" $i $value

done

printf "%#x\n" $value

return $value

}

reg_set_bits()

{

regv=`regread $1`

regv=`setbits $regv $2 $3 $4 `

regwrite $1 $regv

}

reg_set_bits $1 $2 $3 $4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值