From 9e0d0a417797afe957a96a33198fd542f0873ad0 Mon Sep 17 00:00:00 2001 From: RuigeLee Date: Tue, 5 Nov 2024 17:48:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=84=E5=AD=98=E5=99=A8=E4=BF=9D=E6=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tb/sw/src/MstMain.c | 53 +++++++++++++------- tb/sw/src/SlvMain.c | 111 ++++++++++++++++++++++++++--------------- tb/sw/src/mstStartup.S | 4 +- 3 files changed, 106 insertions(+), 62 deletions(-) diff --git a/tb/sw/src/MstMain.c b/tb/sw/src/MstMain.c index 063e846..b2ab91c 100644 --- a/tb/sw/src/MstMain.c +++ b/tb/sw/src/MstMain.c @@ -3,6 +3,8 @@ // #include "uart.h" // #include "gpio.h" // #include "timer.h" +#include "custom_ops.S" + volatile uint32_t *cdr_status = (uint32_t*)( 0x000 + 0x0 ); //read volatile uint32_t *cdr_txLen = (uint32_t*)( 0x000 + 0x4 ); //write @@ -46,18 +48,26 @@ void main() uint32_t led = 0; + asm volatile ( + "li sp, 0\n" + ".4byte 0x600600b\n" + ); + + while(1){ *cdr_softReset = 1; //复位脉冲 *cdr_direct = 0; + register uint32_t flag; asm volatile ( //timer 2s "1:\n" - "rdcycle ra\n" - "srli ra, ra, 12\n" - // "srli ra, ra, 26\n" - "andi ra, ra, 0x1\n" - "beqz ra, 1b\n" + "rdcycle %0\n" + "srli %0, %0, 12\n" + // "srli %0, %0, 26\n" + "andi %0, %0, 0x1\n" + "beqz %0, 1b\n" + :"+r"(flag) ); if( led ){ @@ -82,9 +92,10 @@ void main() //等待发送完成标志 asm volatile ( "1:\n" - "andi ra, sp, 0x01\n" - "beqz ra, 1b\n" + "andi %0, sp, 0x01\n" + "beqz %0, 1b\n" "andi sp, sp, 0xFE\n" + :"+r"(flag) ); @@ -95,9 +106,10 @@ void main() //接收第一个包 asm volatile ( "1:\n" - "andi ra, sp, 0x04\n" - "beqz ra, 1b\n" + "andi %0, sp, 0x04\n" + "beqz %0, 1b\n" "andi sp, sp, 0xFB\n" + :"+r"(flag) ); readDat = *cdr_rxFifo; @@ -110,37 +122,42 @@ void main() //接收第二个包 // asm volatile ( - // "andi ra, sp, 0x08\n" + // "andi %0, sp, 0x08\n" // "1:\n" - // "bnez ra, 1b\n" //error //速度不够,不校验 + // "bnez %0, 1b\n" //error //速度不够,不校验 + // :"+r"(flag), // ); uint32_t temp = *cdr_rxFifo; //上行转发负载 for( uint32_t i = 0; i < (upRecvLen >> 2); i ++ ){ //一次传4byte + register uint32_t upData; asm volatile ( - "andi ra, sp, 0x80\n" + "andi %0, sp, 0x80\n" "1:\n" - "bnez ra, 1b\n" //error 速度不够,不再检查接收 - "lw t1, 0x01c(x0)\n" + "bnez %0, 1b\n" //error 速度不够,不再检查接收 + "lw %1, 0x01c(x0)\n" + :"+r"(flag), "+r"(upData) ); } //CRC asm volatile ( - "andi ra, sp, 0x08\n" + "andi %0, sp, 0x08\n" "1:\n" - "bnez ra, 1b\n" //error + "bnez %0, 1b\n" //error + :"+r"(flag) ); uint32_t crc = *cdr_rxFifo; //CRC //等待接收完成标志 asm volatile ( "1:\n" - "andi ra, sp, 0x08\n" - "beqz ra, 1b\n" + "andi %0, sp, 0x08\n" + "beqz %0, 1b\n" "andi sp, sp, 0xF7\n" + :"+r"(flag) ); totNum = (upRecvLen >> 3); diff --git a/tb/sw/src/SlvMain.c b/tb/sw/src/SlvMain.c index 3749f90..6f33a54 100644 --- a/tb/sw/src/SlvMain.c +++ b/tb/sw/src/SlvMain.c @@ -3,6 +3,8 @@ // #include "uart.h" // #include "gpio.h" // #include "timer.h" +#include "custom_ops.S" + volatile uint32_t *cdr_status = (uint32_t*)( 0x000 + 0x0 ); //read volatile uint32_t *cdr_txLen = (uint32_t*)( 0x000 + 0x4 ); //write @@ -24,9 +26,9 @@ volatile uint32_t *ReadIsLast = (uint32_t*) ( 0x408); -static inline void error() { - while(1); -} +// static inline void error() { +// while(1); +// } @@ -43,18 +45,25 @@ void main() uint32_t isLast; + asm volatile ( + "li sp, 0\n" + ".4byte 0x600600b\n" + ); + while(1){ *cdr_softReset = 1; //复位脉冲 isLast = *ReadIsLast; *cdr_direct = 0; - *WriteGpio = 0xaaaa; + *WriteGpio = 0x01; + register uint32_t flag; asm volatile ( "1:\n" - "andi ra, sp, 0x04\n" - "beqz ra, 1b\n" + "andi %0, sp, 0x04\n" + "beqz %0, 1b\n" "andi sp, sp, 0xFB\n" + : "+r"(flag) ); readDat = *cdr_rxFifo; @@ -63,6 +72,8 @@ void main() readDat = *cdr_rxFifo; + *WriteGpio = 0x03; + if( operator == 0 ){ @@ -72,14 +83,15 @@ void main() //接收本地包 for( uint32_t i = 0; i < 8/4; i++ ){ asm volatile ( - "andi ra, sp, 0x08\n" + "andi %0, sp, 0x08\n" "1:\n" - "bnez ra, 1b\n" //error + "bnez %0, 1b\n" //error + : "+r"(flag) ); readDat = *cdr_rxFifo; } - + *WriteGpio = 0x07; if(!isLast){ // 下行转发新建包头 @@ -89,12 +101,14 @@ void main() //下行转发负载 for( uint32_t i = 0; i < (downSendLen >> 2); i++ ){ //一次传4byte + register uint32_t forData; asm volatile ( - "andi ra, sp, 0x08\n" + "andi %0, sp, 0x08\n" "1:\n" - "bnez ra, 1b\n" //error 速度不够,不再检查接收 - "lw t2, 0x01c(x0)\n" - "sw t2, 0x008(x0)\n" + "bnez %0, 1b\n" //error 速度不够,不再检查接收 + "lw %1, 0x01c(x0)\n" + "sw %1, 0x008(x0)\n" + : "+r"(flag), "+r"(forData) ); //*cdr_0_tx_txFifo = *cdr_0_rx_rxFifo; //接收即发送 } @@ -102,43 +116,51 @@ void main() //空转掉剩余负载 for( uint32_t i = 0; i < (downSendLen >> 2); i++ ){ //一次传4byte + register uint32_t forData; asm volatile ( - "andi ra, sp, 0x08\n" + "andi %0, sp, 0x08\n" "1:\n" - "bnez ra, 1b\n" //error 速度不够,不再检查接收 + "bnez %0, 1b\n" //error 速度不够,不再检查接收 // "lui t0, %hi(0x40000000)\n" - "lw t2, 0x01c(x0)\n" + "lw %1, 0x01c(x0)\n" + : "+r"(flag), "+r"(forData) + ); } } + + *WriteGpio = 0x0f; //CRC asm volatile ( - "andi ra, sp, 0x08\n" + "andi %0, sp, 0x08\n" "1:\n" - "bnez ra, 1b\n" //error + "bnez %0, 1b\n" //error + :"+r"(flag) ); uint32_t crc = *cdr_rxFifo; //CRC //等待接收完成标志 asm volatile ( "1:\n" - "andi ra, sp, 0x08\n" - "beqz ra, 1b\n" + "andi %0, sp, 0x08\n" + "beqz %0, 1b\n" "andi sp, sp, 0xF7\n" + : "+r"(flag) ); - + *WriteGpio = 0x1f; if(!isLast){ //等待发送完成标志 asm volatile ( "1:\n" - "andi ra, sp, 0x01\n" - "beqz ra, 1b\n" + "andi %0, sp, 0x01\n" + "beqz %0, 1b\n" "andi sp, sp, 0xFE\n" + :"+r"(flag) ); } - + *WriteGpio = 0x3f; @@ -159,9 +181,10 @@ void main() //接收第一个包 asm volatile ( "1:\n" - "andi ra, sp, 0x04\n" - "beqz ra, 1b\n" + "andi %0, sp, 0x04\n" + "beqz %0, 1b\n" "andi sp, sp, 0xFB\n" + :"+r"(flag) ); readDat = *cdr_rxFifo; @@ -191,21 +214,24 @@ void main() //接收第二个包 // asm volatile ( - // "andi ra, sp, 0x08\n" + // "andi %0, sp, 0x08\n" // "1:\n" - // "bnez ra, 1b\n" //error //速度不够,不校验 + // "bnez %0, 1b\n" //error //速度不够,不校验 + // :"+r"(flag) // ); uint32_t temp = *cdr_rxFifo; //上行转发负载 for( uint32_t i = 0; i < (upRecvLen >> 2); i ++ ){ //一次传4byte + register uint32_t forData; asm volatile ( - "andi ra, sp, 0x80\n" + "andi %0, sp, 0x80\n" "1:\n" - "bnez ra, 1b\n" //error 速度不够,不再检查接收 - "lw t2, 0x01c(x0)\n" - "sw t2, 0x008(x0)\n" + "bnez %0, 1b\n" //error 速度不够,不再检查接收 + "lw %1, 0x01c(x0)\n" + "sw %1, 0x008(x0)\n" + :"+r"(flag), "+r"(forData) ); // *cdr_1_tx_txFifo = *cdr_1_rx_rxFifo; //接收即发送 @@ -213,18 +239,20 @@ void main() //CRC asm volatile ( - "andi ra, sp, 0x08\n" + "andi %0, sp, 0x08\n" "1:\n" - "bnez ra, 1b\n" //error + "bnez %0, 1b\n" //error + :"+r"(flag) ); crc = *cdr_rxFifo; //CRC //等待接收完成标志 asm volatile ( "1:\n" - "andi ra, sp, 0x08\n" - "beqz ra, 1b\n" + "andi %0, sp, 0x08\n" + "beqz %0, 1b\n" "andi sp, sp, 0xF7\n" + :"+r"(flag) ); totNum = slvNum + (upRecvLen >> 3) - 1; @@ -244,20 +272,21 @@ void main() //等待发送完成标志 asm volatile ( "1:\n" - "andi ra, sp, 0x01\n" - "beqz ra, 1b\n" + "andi %0, sp, 0x01\n" + "beqz %0, 1b\n" "andi sp, sp, 0xFE\n" + :"+r"(flag) ); slvNum = 64 - ( downRecvLen >> 3 ); *WriteGpio = 1 << slvNum; } else if ( operator == 1 ){ - error(); + // error(); } else if ( operator == 2 ){ - error(); + // error(); } else { - error(); + // error(); } } diff --git a/tb/sw/src/mstStartup.S b/tb/sw/src/mstStartup.S index 7fe8c9f..193d37d 100644 --- a/tb/sw/src/mstStartup.S +++ b/tb/sw/src/mstStartup.S @@ -9,12 +9,10 @@ _prog_start: - li x15, 0 li sp, 0 - # picorv32_maskirq_insn(zero, zero) + picorv32_maskirq_insn(zero, zero) call main - li gp, 1; ecall