使用 Microchip SAM9X60 OTP 存储板卡的MAC地址和序列号

2023-11-18

1. 介绍

     SAM9X60 处理器有部分OTP(One Time Programming) Aera 可用于存储user data,这样的话我们就可以将板卡 MAC Address和 SN 序列号写到固定的OTP User Area中。

     为什么要使用 OTP 区域存储MAC地址和序列号呢?答案是为了省钱。如果不使用OTP的话,可能要考虑采用 eeprom 等掉电非易失的存储保存这些固定信息,这样的话就多了一颗料的钱,还得占用I2C总线,PCB布线等。

     这里提一句,NXP i.MX6系列的处理器,对 OTP 区域的划分比Microchip的处理器要详细和更容易访问一些,没有那么多弯弯绕绕,感兴趣的小伙伴可以看一下i.MX6 Reference Manual.

2. MAC地址和SN 格式

假如格式如下:
在这里插入图片描述

3. SAM9X60 OTP Address

SAM9X60 处理器OTP相关的介绍。

Memory Mapping
在这里插入图片描述
查看SAM9X60 芯片手册 ‘23. OTP Memory Controller(OTPC)’章节的相关内容。

在这里插入图片描述
在这里插入图片描述
每一个Packet包含1个32-bit的Header和若干个32-bit的Payload(data)。

Payload 的 SIZE 自己可以在Header的寄存器中定义。

在这里插入图片描述
我们这里要存储1个MAC地址,1个SN序列号的话,为了方便操作和录入,这里就使用4个32bit的payload。Header地址从0x00开始,然后地址0x01 ~ 0x04分别代表payload0~payload4。
在这里插入图片描述

3.1. 写操作流程

在这里插入图片描述

OTPC_MR (0x4)写 0xFF0000   - devmem 0xEFF00004 32 0xFF0000

OTPC_CR (0x0)写 0x40

读 OTPC_ISR (0x1C)查看这个位EOR (bit8)是否是1

读 OTPC_HR (0x20)查看寄存器中的值是否有1,

读 OTPC_DR (0x24)查看寄存器中的值是否有1  (或者读 OTPC_SR (0x0C)寄存器,查看 ONEF bit9 这一位是否为1)

OTPC_MR (0x4)写 0x00000010 ,将OTPC_MR.ADDR 设置为 0,表示从0x0地址开始生成新的packet.这个操作可能触发自动 flush

OTPC_HR (0x20)写 0x301 ,表示我们要使用4个payload, packet类型是 REGULAR 普通的用户数据。

OTPC_AR (0x08)写 0x10000, 表示地址从0x0开始,并且再每次写入数据后,该地址会自动递增,就不用我们再手动增加写入的数据地址了。

OTPC_DR (0x24)写入第一个数据 0x41300001

OTPC_DR (0x24)写入第二个数据 0x00000220

OTPC_DR (0x24)写入第三个数据 0x55508000

OTPC_DR (0x24)写入第四个数据 0x0000001F

OTPC_DR (0x24)写入第五个数据 0x55508001

OTPC_DR (0x24)写入第六个数据 0x0000001F

数据写完之后,OTPC_CR (0x0)写 0x71670001 ,使能programming.

查看写操作是否结束,读 OTPC_ISR (0x1C) EOP bit0是否是1,或者读 OTPC_SR (0x0C) PGM bit0 是否是0

3.2. OTP Lock操作流程

数据写完之后进行Lock,操作如下:
在这里插入图片描述

3.3. 读操作流程

在这里插入图片描述

OTPC_MR (0x4) 寄存器中先写入 header 的地址 ,写入0x0

OTPC_CR.READ (0x0)必须设置为1,OTPC_CR这个寄存器是write-only的,仅仅写入 0x40即可,这样就可以读 user area 了。

等待 OTPC_ISR(0x1C)中 EOR(bit8) 这个位变为1 或者等待 OTPC_SR(0x0C)READ (bit6)这个位变成0,这就意味着整个packet 已经转移到临时寄存器中了

读 OTPC_HR (0x20)头寄存器,读取每一个paylaod word,paylaod word的地址必须已经写入到 OTPC_AR(0x08).DADDR 中。 OTPC_AR.DADDR的地址在读取 OTPC_DR 后会自动递增,所以在连续读取paylaod word数据时,只需要去读 OTPC_DR即可。

4. MAC Address/SN Programming and Read

4.1. Programming

编写的用于板卡 MAC&SN 录入的shell 脚本如下,仅供参考。

#!/bin/sh
 
#########################################################
### Programming MAC Address and SN into SAM9X60 OTP
###
### Author: Heat.Huang
### Date:   2022-5-7
#########################################################
 
function usage(){
    echo "Usage:"
    echo ""
    echo "Programming OTP:"
    echo "    $0 22041100001 00:60:2D:0C:84:27"
 
}
 
function prog_mac(){
    # get serial number
    SN=$1
    if [ ${#SN} -ne 11 ]; then
        echo "ERROR: The type of serial number is error."
        usage
        exit 1
    else
        SN_1=0x${SN:3:11}
        SN_2=0x00000${SN:0:3}
        echo "SN_1: $SN_1"
        echo "SN_2: $SN_2"
    fi
 
    # get mac address
    MAC_ADDR=$2
    if [ ${#MAC_ADDR} -ne 17 ]; then
        echo "ERROR:  The format of MAC adddress you program is error."
        usage
        exit 1
    else
        /sbin/ifconfig eth0 down
        /sbin/ifconfig eth0 hw ether "$MAC_ADDR"
        if [ $? -eq 0 ]; then
            echo "MAC address is valid, can be programmed OTP."
            /sbin/ifconfig eth0 up
        else
            echo "MAC address is not valid."
            /sbin/ifconfig eth0 up
            usage
            exit 1
        fi
        echo "Start programming OTP ......"
        MAC_ADDR_1=`echo $MAC_ADDR | awk '{split($0,addr,":");print addr[1]}'`
        MAC_ADDR_2=`echo $MAC_ADDR | awk '{split($0,addr,":");print addr[2]}'`
        MAC_ADDR_3=`echo $MAC_ADDR | awk '{split($0,addr,":");print addr[3]}'`
        MAC_ADDR_4=`echo $MAC_ADDR | awk '{split($0,addr,":");print addr[4]}'`
        MAC_ADDR_5=`echo $MAC_ADDR | awk '{split($0,addr,":");print addr[5]}'`
        MAC_ADDR_6=`echo $MAC_ADDR | awk '{split($0,addr,":");print addr[6]}'`
 
        HW_OCOTP_MAC0=0x${MAC_ADDR_3}${MAC_ADDR_4}${MAC_ADDR_5}${MAC_ADDR_6}
        HW_OCOTP_MAC1=0x0000${MAC_ADDR_1}${MAC_ADDR_2}
        echo "HW_OCOTP_MAC0: $HW_OCOTP_MAC0"
        echo "HW_OCOTP_MAC1: $HW_OCOTP_MAC1"
    fi 
 
    ##
    ## Steps for program OTPC
    ##
 
    ###
    ### Write Access
    ###
    # read RC register
    echo "Read PMC Clock Generator Main Oscillator Register"
    devmem 0xfffffc20
    # enable RC clock
    echo "Enable the main RC in CKGR_MOR register"
    devmem 0xfffffc20 32 0x01370829
    # read RC register again
    echo "Read PMC Clock Generator Main Oscillator Register again"
    devmem 0xfffffc20
 
    # write OTPC_MR.NPCKT to 0
    echo "write OTPC_MR.NPCKT to 0"
    devmem 0xeff00004 32 0x00000000
    # write OTPC_MR.ADDR to its maximum value
    echo "write OTPC_MR.ADDR to its maximum value"
    devmem 0xeff00004 32 0x00ff0000
    # write OTPC_CR.READ to 1 and wait for the read completion
    echo "write OTPC_CR.READ to 1 and wait for the read completion"
    devmem 0xeff00000 32 0x71670040
    sleep 1
 
    echo "check if End of Read (EOR bit8) is 1"
    devmem 0xeff0001c
    echo "check OTPC Header Register"
    devmem 0xeff00020
    echo "check OTPC Data Register if have data of one"
    devmem 0xeff00024
 
    # Write OTPC_MR.ADDR to 0 and set NPCKT
    devmem 0xeff00004 32 0x00000010
    # write the header value in OTPC_HR
    devmem 0xeff00020 32 0x00000301
    # set DADDR to 0
    devmem 0xeff00008 32 0x00010000
    # write serial number into payload0 and payload1
    devmem 0xeff00024 32 $SN_1
    devmem 0xeff00024 32 $SN_2
    # write eth0 mac address into payload2 and payload3
    devmem 0xeff00024 32 $HW_OCOTP_MAC0
    devmem 0xeff00024 32 $HW_OCOTP_MAC1
 
    # after write , enable OTPC programming
    devmem 0xeff00000 32 0x71670001
    sleep 1
    # check if programming is end
    devmem 0xeff0001c
    sleep 1
    # read the address of new generated packet
    val=`devmem 0xeff00004`
    echo "the address of new generated packet: $val"
    val=0x${val:2:4}0000
    # clear OTPC_MR.NPCKT
    devmem 0xeff00004 32 $val
 
    ###
    ### Read data from OTP to check if write ok
    ###
    devmem 0xeff00000 32 0x00000040
    devmem 0xeff0001c
    devmem 0xeff00020
    devmem 0xeff00008 32 0x00000000
    SN_1_OTP=`devmem 0xeff00024`
    echo "SN_1_OTP = $SN_1_OTP"
 
    SN_2_OTP=`devmem 0xeff00024`
    echo "SN_2_OTP = $SN_2_OTP"
 
    HW_OCOTP_MAC0_OTP=`devmem 0xeff00024`
    echo "HW_OCOTP_MAC0_OTP = $HW_OCOTP_MAC0_OTP"
    HW_OCOTP_MAC0_OTP=${HW_OCOTP_MAC0_OTP:2:9}
    # transfer HEX to DEC
    HW_OCOTP_MAC0_OTP=$((16#$HW_OCOTP_MAC0_OTP))
 
    HW_OCOTP_MAC1_OTP=`devmem 0xeff00024`
    echo "HW_OCOTP_MAC1_OTP = $HW_OCOTP_MAC1_OTP"
    HW_OCOTP_MAC1_OTP=${HW_OCOTP_MAC1_OTP:2:9}
    # transfer HEX to DEC
    HW_OCOTP_MAC1_OTP=$((16#$HW_OCOTP_MAC1_OTP))
 
    ## transfer writen value from HEX to DEC
    HW_OCOTP_MAC0=${HW_OCOTP_MAC0:2:9}
    # transfer HEX to DEC
    HW_OCOTP_MAC0=$((16#$HW_OCOTP_MAC0))
    HW_OCOTP_MAC1=${HW_OCOTP_MAC1:2:9}
    # transfer HEX to DEC
    HW_OCOTP_MAC1=$((16#$HW_OCOTP_MAC1))
 
    if [ "$SN_1_OTP" == "$SN_1" ] && [ "$SN_2_OTP" == "$SN_2" ] && [ $HW_OCOTP_MAC0_OTP -eq $HW_OCOTP_MAC0 ] && [ $HW_OCOTP_MAC1_OTP -eq $HW_OCOTP_MAC1 ]; then
        echo "Programming MAC ADDR and serial number succussful."
    else
        echo "Programming OTP FAIL."
    fi
 
    ###
    ### Lock the new generated packet
    ###
    echo "Lock the new generated packet"
    # write the address value of the header of the packet to lock in OTPC_MR.ADDR
    devmem 0xeff00004 32 $val
    # start a read by seeting OTPC_CR.READ and waiting for the read completion indicated by OTPC_ISR.EOR
    devmem 0xeff00000 32 0x00000040
    sleep 1
    # check if End of Read (EOR bit8) is 1
    devmem 0xeff0001c
    # Write 0x7167 in the OTPC_CR.KEY field and '1' in OTPC_CR.CKSGEN
    devmem 0xeff00000 32 0x71670002
    # the end of the lock operation is indicated by OTPC_ISR.EOL='1' and/or OTPC_SR.LOCK='0'
    lock_ret=`devmem 0xeff0001c`
    eol=${lock_ret:9}
    if [ $eol -eq 2 ]; then
        echo "Lock ok."
    else
        echo "Lock fail."
    fi
 
}
 
 
# Entry
if [ $# == 2 ];then
    prog_mac $@
else
    usage
    exit 1
fi
 
exit 0

4.2. Read

    又写了一个读取MAC地址和SN的shell脚本 get_Mac.sh,可以用于板子 Linux系统启动后,运行该脚本从OTP相应的Aera中读取MAC address,如果读取失败会随机生成一个MAC地址,然后通过ifconfig eth0 hw ether 命令配置网卡的IP。脚本还会从OTP读取序列号,并写入到文件 /images/data/SN 中。

get_Mac.sh 脚本源码如下。

#!/bin/sh
 
 
 
## add by heat
## Steps for set MAC address and get SN from OTPC
##
 
# read RC register
echo "read RC register"
/sbin/devmem 0xfffffc20
# enable RC clock
echo "enable the main RC in CKGR_MOR register"
/sbin/devmem 0xfffffc20 32 0x01370829
# read RC register again
echo "read RC register again"
/sbin/devmem 0xfffffc20
 
# write the address of header into OTPC_MR
/sbin/devmem 0xeff00004 32 0x00000000
# OTPC_CR.READ set to 1 to enable user area
/sbin/devmem 0xeff00000 32 0x00000040
# check OTPC_ISR.EOR if 0 to wait for start reading
/sbin/devmem 0xeff0001c
sleep 1
# read the header of the packet
/sbin/devmem 0xeff00020
# start address of payload
/sbin/devmem 0xeff00008 32 0x00000000
 
# start reading value from OTP
SN_TAIL=`/sbin/devmem 0xeff00024`
SN_HEAD=`/sbin/devmem 0xeff00024`
MAC0_TAIL=`/sbin/devmem 0xeff00024`
MAC0_HEAD=`/sbin/devmem 0xeff00024`
echo "SN_TAIL=$SN_TAIL"
echo "SN_HEAD=$SN_HEAD"
echo "MAC0_TAIL=$MAC0_TAIL"
echo "MAC0_HEAD=$MAC0_HEAD"
 
if [ $MAC0_TAIL == "0x00000000" ] && [ $MAC0_HEAD == "0x00000000" ]; then
    echo "Cannot get correct data from OTP address 0x0, try to read from OTP address 0x29"
    # write the address of header into OTPC_MR
    /sbin/devmem 0xeff00004 32 0x00290000
    # OTPC_CR.READ set to 1 to enable user area
    /sbin/devmem 0xeff00000 32 0x00000040
    # check OTPC_ISR.EOR if 0 to wait for start reading
    /sbin/devmem 0xeff0001c
    sleep 1
    # read the header of the packet
    /sbin/devmem 0xeff00020
    # start address of payload
    /sbin/devmem 0xeff00008 32 0x00000000
 
    # start reading value from OTP
    SN_TAIL=`/sbin/devmem 0xeff00024`
    SN_HEAD=`/sbin/devmem 0xeff00024`
    MAC0_TAIL=`/sbin/devmem 0xeff00024`
    MAC0_HEAD=`/sbin/devmem 0xeff00024`
    echo "SN_TAIL=$SN_TAIL"
    echo "SN_HEAD=$SN_HEAD"
    echo "MAC0_TAIL=$MAC0_TAIL"
    echo "MAC0_HEAD=$MAC0_HEAD"
fi
 
NONE_MAC0=false
NONE_MAC1=false
## analyse eth0 MAC address
if [ $MAC0_TAIL == "0x00000000" ] && [ $MAC0_HEAD == "0x00000000" ]; then
    echo "Cannot get correct MAC address form OTP"
    echo "Use Random MAC Address"
    MAC0_ADDR_RAND=`echo $RANDOM|md5sum`
    MAC0_ADDR_1=00
    MAC0_ADDR_2=1F
    MAC0_ADDR_3=55
    MAC0_ADDR_4=`echo $MAC0_ADDR_RAND|cut -c 1-2`
    MAC0_ADDR_5=`echo $MAC0_ADDR_RAND|cut -c 3-4`
    MAC0_ADDR_6=`echo $MAC0_ADDR_RAND|cut -c 5-6`
else
    case ${#MAC0_TAIL} in
        2)
        MAC0_OPT_SECTOR_TAIL="0x00000000"
        ;;
        3)
        MAC0_OPT_SECTOR_TAIL="0x0000000"`echo $MAC0_TAIL | cut -b 3`
        ;;
        4)
        MAC0_OPT_SECTOR_TAIL="0x000000"`echo $MAC0_TAIL | cut -b 3-4`
        ;;
        5)
        MAC0_OPT_SECTOR_TAIL="0x00000"`echo $MAC0_TAIL | cut -b 3-5`
        ;;
        6)
        MAC0_OPT_SECTOR_TAIL="0x0000"`echo $MAC0_TAIL | cut -b 3-6`
        ;;
        7)
        MAC0_OPT_SECTOR_TAIL="0x000"`echo $MAC0_TAIL | cut -b 3-7`
        ;;
        8)
        MAC0_OPT_SECTOR_TAIL="0x00"`echo $MAC0_TAIL | cut -b 3-8`
        ;;
        9)
        MAC0_OPT_SECTOR_TAIL="0x0"`echo $MAC0_TAIL | cut -b 3-9`
        ;;
        10)
        MAC0_OPT_SECTOR_TAIL=$MAC0_TAIL
        ;;
        *)
        NONE_MAC0=true
        ;;
    esac
    case ${#MAC0_HEAD} in
        2)
        MAC0_OPT_SECTOR_HEAD="0x0000"
        ;;
        3)
        MAC0_OPT_SECTOR_HEAD="0x000"`echo $MAC0_HEAD | cut -b 3`
        ;;
        4)
        MAC0_OPT_SECTOR_HEAD="0x00"`echo $MAC0_HEAD | cut -b 3-4`
        ;;
        5)
        MAC0_OPT_SECTOR_HEAD="0x0"`echo $MAC0_HEAD | cut -b 3-5`
        ;;
        6)
        MAC0_OPT_SECTOR_HEAD="0x0000"`echo $MAC0_HEAD | cut -b 3-6`
        ;;
        7)
        MAC0_OPT_SECTOR_HEAD="0x000"`echo $MAC0_HEAD | cut -b 3-7`
        ;;
        8)
        MAC0_OPT_SECTOR_HEAD="0x00"`echo $MAC0_HEAD | cut -b 3-8`
        ;;
        9)
        MAC0_OPT_SECTOR_HEAD="0x0"`echo $MAC0_HEAD | cut -b 3-9`
        ;;
        10)
        MAC0_OPT_SECTOR_HEAD=$MAC0_HEAD
        ;;
        *)
        NONE_MAC0=true
        ;;
    esac
 
    MAC0_ADDR_1=`echo ${MAC0_OPT_SECTOR_HEAD} | cut -b 7-8`
    MAC0_ADDR_2=`echo ${MAC0_OPT_SECTOR_HEAD} | cut -b 9-10`
    MAC0_ADDR_3=`echo ${MAC0_OPT_SECTOR_TAIL} | cut -b 3-4`
    MAC0_ADDR_4=`echo ${MAC0_OPT_SECTOR_TAIL} | cut -b 5-6`
    MAC0_ADDR_5=`echo ${MAC0_OPT_SECTOR_TAIL} | cut -b 7-8`
    MAC0_ADDR_6=`echo ${MAC0_OPT_SECTOR_TAIL} | cut -b 9-10`
 
    echo "Got correct MAC address form OTP"
 
fi
 
## set eth0 MAC address
echo "eth0 MAC: $MAC0_ADDR_1:$MAC0_ADDR_2:$MAC0_ADDR_3:$MAC0_ADDR_4:$MAC0_ADDR_5:$MAC0_ADDR_6"
/sbin/ifconfig eth0 down
/sbin/ifconfig eth0 hw ether "$MAC0_ADDR_1:$MAC0_ADDR_2:$MAC0_ADDR_3:$MAC0_ADDR_4:$MAC0_ADDR_5:$MAC0_ADDR_6"
/sbin/ifconfig eth0 up
 
## get SN from OTP
if [ $SN_TAIL == "0x00000000" ] && [ $SN_HEAD == "0x00000000" ]; then
    echo "Cannot get correct SN form OTP"
else
    echo "Got correct SN form OTP"
    SN_1=`printf "%08x" ${SN_TAIL}`
    SN_2=`printf "%03x" ${SN_HEAD}`
    echo "SN: ${SN_2}${SN_1}"
    echo "${SN_2}${SN_1}" > /images/data/SN
fi

没有做什么特别的操作,就是操作一堆寄存器。。。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Microchip SAM9X60 OTP 存储板卡的MAC地址和序列号 的相关文章

  • bash 支持字边界正则表达式吗?

    我试图在再次添加该单词之前匹配列表中是否存在该单词 以避免重复 我正在使用 bash 4 2 24 并尝试以下操作 foo bmyword b also foo
  • 在bash中,是否有相当于“错误消息”的东西

    在 perl 中 您可以使用错误消息退出die some msg bash 中是否有等效的单个命令 现在 我正在使用命令来实现这一点 echo some msg exit 1 你可以很容易地自己推出 die echo 1 gt 2 exit
  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh
  • 使用 grep 查找包含所有搜索字符串的行

    我有一个文件 其中包含很多与此类似的行 id 2796 some model Profile message type MODEL SAVE fields account 14 address null modification times
  • .profile 无法从 Mac 终端运行

    我有一个 profile 文件 我正在终端中读取并使用别名 但在某些时候 别名由于没有明确的原因而停止工作 其他命令仍在工作 为了快速修复 我删除了 rm 并在用户目录中重新创建了 profile 文件 我可以看到 至少在该目录中没有 ba
  • Pure Bash 替换捕获组

    我有这个示例字符串 test string 13A6 该字符 数字可以是从 0 到 9 以及从 A 到 F 我想要这个输出 1 3 A 6 我有这个工作 result echo test string sed s g 我想在没有 sed 的
  • 如何在 Linux shell 中将十六进制转换为 ASCII 字符?

    假设我有一个字符串5a 这是 ASCII 字母的十六进制表示Z 我需要找到一个 Linux shell 命令 它将接受一个十六进制字符串并输出该十六进制字符串代表的 ASCII 字符 所以如果我这样做 echo 5a command im
  • 如何在 Windows 下向 .sh 脚本传递参数?

    我正在尝试在 Windows 下执行 sh 脚本 我安装了 Git 它允许我执行 sh 文件 但是 如果不使用 sh 作为执行前缀 我似乎无法传递任何参数 我的 sh 文件 echo Test 1 如果我用以下命令执行它 gt sh tes
  • 如何查找所有以句号结尾的单词?

    我有一个包含许多以 a 结尾的单词的文件 其中大部分是缩写 例如 etc p s 如何输出一个仅显示一次所有这些单词的列表 所有单词前面都有一个空格 因此可以使用该空格来查找单词的开头 没有一个单词出现在该行的开头 文件中没有句子 因此句点
  • 从 php 执行 bash 脚本并立即输出回网页

    我有一组 bash 和 Perl 脚本 开发在 Linux Box 上部署所需的目录结构 可选 从svn导出代码 从这个源构建一个包 这在终端上运行良好 现在 我的客户请求此流程的 Web 界面 例如 某些页面上的 创建新包 按钮将一一调用
  • 如何在shell中输出返回码?

    我正在尝试通过调用自定义 shell 脚本sh bin sh c myscript sh gt log txt 2 gt 1 echo 该命令的输出是创建的后台进程的 PID 我想指导 bin sh保存返回码myscript sh到某个文件
  • 协助 awk/bash 捕获内存差异

    我正在尝试从以下文件中提取以下输出 xr lab show clock Thu Sep 19 14 38 02 812 WIB 14 38 02 893 WIB Thu Sep 19 2019 xr lab xr lab xr lab sh
  • 在bash脚本中分割字符串[重复]

    这个问题在这里已经有答案了 我想分割一个字符串并需要其中的一些参数 USER dn uid dfl3030 cn users cn accounts dc tenant dc ycs dc io cn Reb Lena Schmidt kr
  • Linux - 从第二个选项卡获取文本

    假设我们有这样的文件 一些文本11 一些文本12 一些文本13 一些文本21 一些文本22 一些文本23 文本由制表符分隔 我们知道第 1 列中的一些文本 但希望从第 2 列中获取文本 我知道我可以通过以下方式获取线路 grep somet
  • 在两次之间每分钟执行一次 Cronjob

    我需要在 crontab 中每分钟运行一个 bash 脚本8 45am and 9 50am每天的 Code 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 8 home pull sh gt ho
  • 在退出脚本之前等待后台进程完成

    在退出脚本 TCL Bash 之前 如何确保所有后台进程已完成执行 我正在考虑将所有后台进程 pid 写入 pid 文件 然后最后 pgrep pidfile 以查看在退出之前是否有任何进程仍在运行 有一些更简单的方法可以做到这一点吗 TC
  • 在 shell 脚本中将一个子字符串替换为另一个字符串

    我有 我爱苏子并结婚 我想将 苏子 更改为 萨拉 firstString I love Suzi and Marry secondString Sara 期望的结果 firstString I love Sara and Marry 要更换
  • 如何使用 sed 将空格替换为 \(space)?

    当我使用 sed 将所有空格替换为 X 时 该命令有效 命令为 sed s X g filelist tmp 但是 当我尝试用 space 替换所有出现的空格时 代码是 sed s g filelist tmp 这不起作用 我究竟做错了什么
  • bash循环跳过注释行

    我正在循环文件中的行 我只需要跳过以 开头的行 我怎么做 bin sh while read line do if line doesn t start with then echo line fi done lt tmp myfile 谢
  • 在复杂的文件夹结构中进行测试

    我正在 golang 中构建一个设计模式存储库 为了运行所有测试 我使用这个 bash 脚本 有用 bin bash go test creational abstract factory go go test creational bui

随机推荐

  • errcode = 40163; errmsg = "code been used"(提供一种解决思路)

    最近在做微信开发 就在开发完毕测试的时候 遇到一个大问题 每次新用户进入的时候就报错 错误基本上就是code been used 我去百度了好久 没有找到合适的方案 后来我仔细的看了一下微信开发文档 终于解决了 注 该方法不一定对所有人有效
  • C语言中关键字const、static、volatile的用法分析

    1 const 作为一个程序员 我们看到关键字const时 首先想到的应该是 只读 因为 它要求其所修饰的对象为常量 不可对其修改和二次赋值操作 不能作为左值出现 看几个例子 const int a 同上面的代码行是等价的 都表示一个常整形
  • TCP 、UDP、IP包的最大长度是多少?

    对于UDP协议来说 整个包的最大长度为65535 其中包头长度是65535 20 65515 对于TCP协议来说 整个包的最大长度是由最大传输大小 MSS Maxitum Segment Size 决定 MSS就是TCP数据包每次能够传 输
  • 数据回归算法

    文章目录 效果一览 文章概述 源码设计 参考资料 效果一览 文章概述 数据回归算法 Matlab实现逐步回归预测模型 逐步回归 Stepwise Regression 其基本思想是将变量逐个引入模型 每引入一个预测变量 解释变量 后都要进行
  • 作为一个Java程序员,深入java虚拟机第四版

    第一阶段 架构师筑基必备技能 我觉得 但凡是个成年人应该都清楚扎实的基本功对自己的工作帮助有多重要 从各大招聘网站的招聘要求来看 第一条都明确说明需要扎实的Java基础 因此 一般笔试以及面试的第一轮 对基础的考察是比较多的 其实我发现有很
  • 如何写一个随机洗牌函数

    看到了很多人写得随机洗牌函数 但是感觉写得都不是太好 自己写了一个试试 基本要求 给定一定范围的数比如最大值最小值 min max 在这个之间进行随机洗牌 首先生成一个按min到最大的max的数组a 对数组进行循环 每次随机生成一个要取的下
  • c++ 中ref 和引用的区别

    c 中 本身可以使用 来实现引用 那为什么还会出现ref 呢 ref int f2 int c c cout lt lt in function c lt lt c lt
  • Java基础 (三):LinkedList(含使用方法详解)

    Java LinkedList 链表 Linked list 是一种常见的基础数据结构 是一种线性表 但是并不会按线性的顺序存储数据 而是在每一个节点里存到下一个节点的地址 链表可分为单向链表和双向链表 一个单向链表包含两个值 当前节点的值
  • 放大倍数超5万倍的Memcached DDoS反射攻击,怎么破?

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 作者 腾讯游戏云 背景 Memcached攻击创造DDoS攻击流量纪录 近日 利用Memcached服务器实施反射DDoS攻击的事件呈大幅上升趋势 DDoS攻击流量首次过T 引发业界
  • Java实现对数据库的查操作

    查询数据库得到的结果有很大的可能会得到若干条 因此executeQuery 方法的返回值是一个集合 返回类型由ResultSet接收 数据库的增删改操作 在JDBCUtils工具类中对close方法进行方法重载 public static
  • 【Spark NLP】第 7 章:分类和回归

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 2.VHDL的基本结构和语法(一)

    目录 1 VHDL基本结构 1 1 实体 Entity 类属说明 端口方向 IN OUT INOUT BUFFER 1 2 结构体 Architecture 1 3 库 程序包的调用 1 4 VHDL语句 1 4 1 并行语句 并行信号赋值
  • web项目读取resource目录下的资源

    本地读取资源文件 1 方式 File file new File src main resources properties basecom properties InputStream in new FileInputStream fil
  • 关于ScrollView嵌套多个RecyclerView滑动冲突,可以很流畅的滑动

    首先不建议过多的嵌套 可以采取其他方式替换 当ScrollIView内部只有一个RecyclerView的时候
  • 【HTML】基础常用标签汇总

    目录 前言 最基础的标签 常用标签 文本相关 文本格式化标签 图像标签 超链接 表格 列表 无序列表 有序列表 自定义列表 表单 基本结构 表单域 表单元素控件 前言 总所周知 一个网站 web 分为三部分 1 HTML 结构 2 CSS
  • 2022年最新Vue+electron项目创建

    一 前言 大多数文章都停留在electron vue中 但是这个库不怎么更新了 最近的更新是九月前 看了很多文章都换其他的工具来构建了 这里推荐GITHUB一个大佬写的基于vue cli的插件 构建项目非常简单 插件的GITHUB源代码 话
  • 力扣刷题26. 删除有序数组中的重复项

    采用双指针法 思路如下 class Solution public int removeDuplicates int nums if nums length 0 return 0 int p 0 int q 1 while q
  • 【华为OD机试真题2023B卷 JAVA&JS】选修课

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 选修课 知识点字符串哈希表排序 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 现有两门选修课 每门选修课都有一部分学生选修 每个学生都有选修课的成绩 需要你找出同时选
  • OCaml学习笔记(二)——Introduction to Objective Camel

    Chapter2 Simple Expressions 2 1 注释语句 OCaml语言中注释部分写在 和 之间 可以相互嵌套 注释部分当作空格处理 2 2 基本表达式 OCaml中每个有效的表达式都有一个类型 某个类型的表达式不能用作其他
  • 使用 Microchip SAM9X60 OTP 存储板卡的MAC地址和序列号

    1 介绍 SAM9X60 处理器有部分OTP One Time Programming Aera 可用于存储user data 这样的话我们就可以将板卡 MAC Address和 SN 序列号写到固定的OTP User Area中 为什么要