DSP芯片C6678的SRIO及其中断跳转的配置
C6678SRIO读写测试+门铃中断跳转测试
- SRIO简述
- 代码前言
- SRIO配置
- 原始代码
- 1.使能电源
- 2.初始化SRIO
- 回环修改
- 3.SRIO测试
- Doorbell门铃中断
- 1.初始化中断函数
- 2.中断向量表建立
- 3.中断向量表的链接
本博客基于创龙“678ZH产品线”的SRIO代码,部分参考于网友们的博客,参考文档将在结尾列出
SRIO简述
一句话:高速串行通信协议
有多高速:最高25Gbps≈3G的文件一秒传输完成
什么串行:四组口,可任意配置为用一组还是多用几组(每组最快6.25Gbps)
适合场景:任何高速数据交换场景,但其实小编只在FPGA与DSP之间应用。
例如:FPGA将图像数据传送到DSP,然后DSP经过识别处理后呈现给出结果。
另外小编觉得最神奇的是SRIO是可以直接将数据放入指定位置的,例如FPGA如果需要将数据给到DSP处理,FPGA可以直接设置放入指定的DDR地址,或者其他高速缓存地址,这是小编认为SRIO最好玩的地方。
代码前言
当说明文档太多而不知道看哪些的时候,最好的方法就是直接上代码(尤其是对于这种已经十几年前的芯片)。
笔者当前一共看过了3套C6678的SRIO相关代码,从难到简单的排序是这样的
难:pdk_c667x_2_0_16\packages\MyExampleProjects
中:C6678\STK_C6678\SRIO
易:678ZH产品线\7.案例源码\SRIO的ZYNQ+DSP核间通讯\srio_initiator
TI官方提供的例子是最难的,其次就是TI论坛上基于keystone的例子,然后就是创龙提供的简化版的例子。小编是先看了keystone的例子,必须要对照文档一步步看,因为涉及到的功能很多。然后再看的创龙,创龙的例子太简单了,只有发送和读取,非常适合刚入DSP门的同学学习。
下面SRIO的初始测试就是基于创龙的代码(创龙代码都是使用了TI官方的CSL库进行配置的,用户需要自行用include options来包含(eclipse系列用户应该容易理解),我用的是“pdk_C6678_1_1_2_6\packages\ti\csl”)。
以下创龙demo的例子大家可以去其官网上进行下载哦。
SRIO配置
创龙的代码是直接与FPGA交互,但是稍微一改就可以变成回环测试,非常适合于FPGA端还没有调好的场景。
原始代码
创龙非常贴心的将代码全部放到了main一个文档里面,异常的简洁明了。
我们先来整体看一下
int main(void)
{int8_t ret;uint32_t core_num;/* enable SRIO PSC */ret = enable_srio();if(ret != 0) {printf("srio psc initialization failed ! \r\n");return -1;}/* configure and enable SRIO subsystem */ret = srio_device_init();if(ret != 0) {printf("srio system initialization failed ! \r\n");return -1;}/* read the DSP Core Number */core_num = CSL_chipReadReg(CSL_CHIP_DNUM);/* srio transmit test: srio write(NWRITE) --> srio read(NREAD) */ret = srio_test(core_num, TARGET_ADDRESS, TARGET_SIZE, Srio_Ftype_WRITE);if(ret != 0) {printf("srio test occur error! \r\n");return -1;}printf("SRIO test %d cycles, " \"errcnt: %d, total size %d KB, ", \LOOP_TIMES, err_count, TARGET_SIZE * LOOP_TIMES / 1024);printf("write type: NWRITE, avg write rate: %.2f Gbps, ", \w_rate_total / LOOP_TIMES);printf("read type: NREAD, avg read rate: %.2f Gbps\r\n\n\n", \r_rate_total / LOOP_TIMES);/* clear var to zero */w_rate_total = 0.0;r_rate_total = 0.0;err_count = 0;/* srio transmit test: srio write(SWRITE) --> srio read(NREAD) */ret = srio_test(core_num, TARGET_ADDRESS, TARGET_SIZE, Srio_Ftype_SWRITE);if(ret != 0) {printf("srio test occur error! \r\n");return -1;}printf("SRIO test %d cycles, " \"errcnt: %d, total size %d KB, ", \LOOP_TIMES, err_count, TARGET_SIZE * LOOP_TIMES / 1024);printf("write type: SWRITE, avg write rate: %.2f Gbps, ", \w_rate_total / LOOP_TIMES);printf("read type: NREAD, avg read rate: %.2f Gbps\r\n\n\n", \r_rate_total / LOOP_TIMES);return 0;
}
以上代码,使能SRIO电源管理、初始化SRIO、SRIO测试,一共三步,就能跑起来测试。
1.使能电源
电源设置非常固定,只要将TI官方csl库包进来然后使用即可。
static int32_t enable_srio (void)
{/* SRIO power domain is turned OFF by default. It needs to be turned on before doing any* SRIO device register access. This not required for the simulator*//* Set SRIO Power domain to ON */CSL_PSC_enablePowerDomain(CSL_PSC_PD_SRIO);/* Enable the clocks too for SRIO */CSL_PSC_setModuleNextState(CSL_PSC_LPSC_SRIO, PSC_MODSTATE_ENABLE);/* Start the state transition */CSL_PSC_startStateTransition(CSL_PSC_PD_SRIO);/* Wait until the state transition process is completed. */while(!CSL_PSC_isStateTransitionDone(CSL_PSC_PD_SRIO));/* Return SRIO PSC status */if((CSL_PSC_getPowerDomainState(CSL_PSC_PD_SRIO) != PSC_PDSTATE_ON) ||(CSL_PSC_getModuleState(CSL_PSC_LPSC_SRIO) != PSC_MODSTATE_ENABLE)) {/* SRIO Power on failed. Return error */return -1;}/* SRIO ON. Ready for use */return 0;
}
2.初始化SRIO
链接: 各部寄存器参数说明
初始化SRIO是用来选择使用几组接口、选择多大速率的一些基本操作
还有最后确认是否建立好了SRIO连接(如果FPGA没写好,那就只能用回环模式通过,否则就会报连接错误)
在这一部分,用户可以将其设置为回环测试,只用修改一个小小的地方即可
static int32_t srio_device_init (void)
{uint32_t i, wait_time;uint32_t status;/* Get the CSL SRIO Handle. */hSrio = CSL_SRIO_Open(0);if(hSrio == NULL)return -1;/* Code to disable SRIO reset isolation */if(CSL_PSC_isModuleResetIsolationEnabled(CSL_PSC_LPSC_SRIO))CSL_PSC_disableModuleResetIsolation(CSL_PSC_LPSC_SRIO);/* Disable the SRIO Global block */CSL_SRIO_GlobalDisable(hSrio);/* Disable each of the individual SRIO blocks. */for(i = 0; i <= 9; i++)CSL_SRIO_DisableBlock(hSrio, i);/* BOOT_COMPLETE = 0: write enabled */CSL_SRIO_SetBootComplete(hSrio, 0);/* Now enable the SRIO block and all the individual blocks also. */CSL_SRIO_GlobalEnable(hSrio);for(i = 0; i <= 9; i++)CSL_SRIO_EnableBlock(hSrio, i);/* Configure SRIO ports mode. */for(i = 0; i <= 3; i++)// CSL_SRIO_SetNormalMode(hSrio, i);CSL_SRIO_SetLoopbackMode(hSrio, i);/* Enable Automatic Priority Promotion of response packets. */CSL_SRIO_EnableAutomaticPriorityPromotion(hSrio);/** Set the SRIO Prescalar select to operate in the range* PERSCALER_SELECT = 0: 44.7 ~ 89.5 MHz*/CSL_SRIO_SetPrescalarSelect(hSrio, 0);/* Unlock the Boot Configuration Kicker */CSL_BootCfgUnlockKicker();/** MPY = 0x50: 10x* ENPLL = 1: PLL Enable* srio_serdes_clock = RefClk(250MHz) * MPY = 2.5GHz*/CSL_BootCfgSetSRIOSERDESConfigPLL(0x51);/** Configure the SRIO SERDES Receive Configuration* ENOC = 1: Enable offset compensation* EQ = 1: Fully adaptive equalization* CDR = 5: First order with fast lock* ALIGN = 1: Comma alignment enabled* TERM = 1: Input termination, the only valid value for this field is 0x1* RATE = 1: Data Rate = 2 * srio_serdes_clock = 5Gbps* BUSWIDTH = 1: Bus width, indicate a 20-bit wide parallel bus to the clock* ENRX = 1: Enable this receiver*/for(i = 0; i <= 3; i++)CSL_BootCfgSetSRIOSERDESRxConfig(i, 0x00468495);/** Configure the SRIO SERDES Transmit Configuration* MSYNC = 1: Enables the channel as the master lane* FIRUPT = 1: Transmitter pre and post cursor FIR filter update* TWPST1 = 18: Adjacent post cursor Tap weight* TWPRE = 1: Precursor Tap weight* SWING = 16: Output swing* RATE = 1: Data Rate = 2 * srio_serdes_clock = 5Gbps* BUSWIDTH = 1: Bus width, indicate a 20-bit wide parallel bus to the clock* ENRX = 1: Enable this receiver*/for(i = 0; i <= 3; i++)CSL_BootCfgSetSRIOSERDESTxConfig(i, 0x001C8F95);/* Loop around till the SERDES PLL is not locked. */while(1) {/* Get the SRIO SERDES Status */CSL_BootCfgGetSRIOSERDESStatus(&status);if(status & 0x1)break;}/* Lock the Boot Configuration Kicker */CSL_BootCfgLockKicker();/* Clear the LSU pending interrupts. */CSL_SRIO_ClearLSUPendingInterrupt(hSrio, 0xFFFFFFFF, 0xFFFFFFFF);/* Set the 16 bit and 8 bit identifier for the SRIO Device */CSL_SRIO_SetDeviceIDCSR(hSrio, CSR_LOCAL_DEVICEID_8BIT, CSR_LOCAL_DEVICEID_16BIT);/* Configure the Base Routing Register */CSL_SRIO_SetTLMPortBaseRoutingInfo(hSrio, 0, 1, 1, 0, 0);CSL_SRIO_SetTLMPortBaseRoutingPatternMatch(hSrio, 0, 1, REMOTE_DEVICEID1_8BIT, 0xFF);/* Configure the PLM for all the ports */for (i = 0; i <= 3; i++) {/* TODO: We need to ensure that the Port 0 is configured to support both* the 2x and 4x modes. The Port Width field is read only. So here we simply* ensure that the Input and Output ports are enabled */CSL_SRIO_EnableInputPort(hSrio, i);CSL_SRIO_EnableOutputPort(hSrio, i);/** Discovery timer is specified to be 28 msec +/- 4 msec* Discovery timer = RefClk(250MHz) period * PRESCALAR_SRV_CLK * 52429 * DISCOVERY_TIMER* = (1 / 250Mhz) * (250 / 10) * 52429 * 5 = 26.2ms*/CSL_SRIO_SetPLMPortDiscoveryTimer(hSrio, i, 0x5);}/* Set the Port link timeout CSR */CSL_SRIO_SetPortLinkTimeoutCSR(hSrio, 0x000FFF);CSL_SRIO_SetPortResponseTimeoutCSR(hSrio, 0xFF0FFF);/* Set the Port General CSR: Only executing as Master Enable */CSL_SRIO_SetPortGeneralCSR(hSrio, 0, 1, 0);/* Clear the sticky register bits */CSL_SRIO_SetLLMResetControl(hSrio, 1);/* Set the Data Streaming MTU */CSL_SRIO_SetDataStreamingMTU(hSrio, 64);/* Configure the path mode 4 for the ports */CSL_SRIO_SetPLMPortPathControlMode(hSrio, 0, 4);/** Set the LLM Port IP Prescalar* PRESCALAR_SRV_CLK = RefClk(250MHz) / 10*/CSL_SRIO_SetLLMPortIPPrescalar(hSrio, 0x19);/* Enable the peripheral */CSL_SRIO_EnablePeripheral(hSrio);/* Configuration has been completed *//* BOOT_COMPLETE = 1: write to read only registers disabled */CSL_SRIO_SetBootComplete(hSrio, 1);/* This code checks if the ports are operational or not */wait_time = 100;while(wait_time) {if(CSL_SRIO_IsPortOk(hSrio, 0) == TRUE) {break;} else {wait_time --;/* Delay 1 ms */cpu_delaycycles(1000000);}}if(wait_time == 0) {printf("srio system initialization time out!\r\n");return -1;}/* Initialization has been completed */return 0;
}
波特率的计算方式如下:
参考时钟(板卡外部时钟)*倍频得出一个时钟A
时钟A经过RATE的选择,变成实际的通讯时钟
例如:外部时钟为250Mhz,经过10倍频=2.5Ghz,再经过RATE选择half模式就变成了5Gbps。
下图展示了倍频设置,对应代码中的CSL_BootCfgSetSRIOSERDESConfigPLL(0x51);
下图代表了RATE对应关系,对应代码中的
CSL_BootCfgSetSRIOSERDESRxConfig(i, 0x00468495);和
CSL_BootCfgSetSRIOSERDESTxConfig(i, 0x001C8F95);
还有一些其他需要计算的参数,按照代码中注释计算即可,但是注意要将250Mhz的参考时钟(外部时钟)改为自己板卡上的时钟再进行计算。
回环修改
将CSL_SRIO_SetNormalMode(hSrio, i);改为
CSL_SRIO_SetLoopbackMode(hSrio, i);
3.SRIO测试
在此demo中,SRIO会先将数据发送,然后再回读进行比较。
发送使用的是nwrite——即无响应写入
回读使用的是nread——即无响应读取
这部分代码需要用户对SRIO有一定的了解,会涉及到目的地址与本地地址。在这小编就不做说明了哈。
static int8_t srio_test(uint8_t LSU_Number, uint32_t target_addr,uint32_t transfer_size, Srio_Ftype w_format_type)
{SRIO_LSU_TRANSFER tparams;uint32_t main_pll_freq;int32_t status = 0;uint32_t i = 0, j = 0, timeout = 0;uint8_t uiCompletionCode = 0, context = 0;uint8_t contextBit = 0, transactionID = 0;uint32_t transStart = 0, transCost = 0;float w_rate = 0, r_rate = 0;uint32_t w_time = 0, r_time = 0;uint8_t *w_buff, *r_buff;uint8_t *w_buff_global, *r_buff_global, *t_buff_global;uint32_t *srio_trans_src, *srio_trans_dst;/* initialize variables */TSCL = 0;TSCH = 0;/* Get the cpu freq */main_pll_freq = platform_get_main_pll_freq();/* malloc buffer */w_buff = malloc(transfer_size);if(w_buff == NULL) {status = -1;printf("Failed to alloc meory !\r\n");goto err_alloc_wbuff;}r_buff = malloc(transfer_size);if(r_buff == NULL) {status = -1;printf("Failed to alloc meory !\r\n");goto err_alloc_rbuff;}/* convert the buffer address to global address */w_buff_global = (uint8_t *)Convert_CoreLocal2GlobalAddr((uint32_t)w_buff);r_buff_global = (uint8_t *)Convert_CoreLocal2GlobalAddr((uint32_t)r_buff);t_buff_global = (uint8_t *)target_addr;/* initialize the test data for buffer */for(i = 0; i < transfer_size; i++) {srand(i);w_buff[i] = rand() % 0xFF;;r_buff[i] = 0;}/* Loop times */for(j = 0; j < LOOP_TIMES; j++) {/* wait loopback complete time set as 10ms, base on cpu freq as 1000MHz */timeout = 10000000;/* 1.1 caculate the read and write buffer for srio transfer address */srio_trans_src = (uint32_t *)w_buff_global;srio_trans_dst = (uint32_t *)t_buff_global;/* 1.2 set transfer parameters, srio nwrite test, w_buff -> devmem_buff */memset((void *)&tparams, 0, sizeof(tparams));tparams.rapidIOLSB = (uint32_t)srio_trans_dst;tparams.dspAddress = (uint32_t)srio_trans_src;tparams.bytecount = transfer_size;if(w_format_type == Srio_Ftype_WRITE)tparams.ttype = Srio_Ttype_Write_NWRITE;tparams.ftype = w_format_type;tparams.dstID = REMOTE_DEVICEID1_8BIT;tparams.outPortID = SRIO_PORT;tparams.idSize = 0;/* wait lsu have available shadow register */while(1) {if (CSL_SRIO_IsLSUFull(hSrio, LSU_Number) == FALSE)break;}/* Get the LSU Context and Transaction Information. */CSL_SRIO_GetLSUContextTransaction(hSrio, LSU_Number,&contextBit, &transactionID);transStart = _itoll(TSCH, TSCL);/* start srio transfer */CSL_SRIO_SetLSUTransfer(hSrio, LSU_Number, &tparams);/* wait for a transfer completion interrupt occur */while(timeout) {CSL_SRIO_GetLSUCompletionCode(hSrio, LSU_Number, transactionID,&uiCompletionCode, &context);if(context == contextBit) {/* disable pending transactions */transactionID = 0xFF;contextBit = 0xFF;if(uiCompletionCode != 0) {status = -1;printf("SRIO transfer have error completed code %d\r\n", -(uiCompletionCode));goto err_transfer;}break;} else {timeout--;/* delay 1 cpu cyle */asm (" nop");}}if(timeout == 0) {/* if transfer timeout occurs, return error status */status = -1;printf("SRIO transfer timeout\r\n");goto err_transfer;}/* Calculate srio transfer used time */transCost = _itoll(TSCH, TSCL) - transStart;w_time = transCost;/* Calculate srio transfer write rate */w_rate = (float)transfer_size * main_pll_freq / w_time / 1024 / 1024 / 1024 * 8;/* wait loopback complete time set as 10ms, base on cpu freq as 1000MHz */timeout = 10000000;/* 1.3 caculate the read and write buffer for srio transfer address */srio_trans_src = (uint32_t *)t_buff_global;srio_trans_dst = (uint32_t *)r_buff_global;/* 1.4 set transfer parameters, srio nread test, devmem_buff -> r_buff */memset((void *)&tparams, 0, sizeof(tparams));tparams.rapidIOLSB = (uint32_t)srio_trans_src;tparams.dspAddress = (uint32_t)srio_trans_dst;tparams.bytecount = transfer_size;tparams.ttype = Srio_Ttype_Request_NREAD;tparams.ftype = Srio_Ftype_REQUEST;tparams.dstID = REMOTE_DEVICEID1_8BIT;tparams.outPortID = SRIO_PORT;tparams.idSize = 0;/* wait LSU have available shadow register */while(1) {if (CSL_SRIO_IsLSUFull (hSrio, LSU_Number) == FALSE)break;}/* Get the LSU Context and Transaction Information. */CSL_SRIO_GetLSUContextTransaction(hSrio, LSU_Number,&contextBit, &transactionID);transStart = _itoll(TSCH, TSCL);/* start srio transfer */CSL_SRIO_SetLSUTransfer(hSrio, LSU_Number, &tparams);/* wait for a transfer completion interrupt occur */while(timeout) {CSL_SRIO_GetLSUCompletionCode(hSrio, LSU_Number, transactionID,&uiCompletionCode, &context);if(context == contextBit) {/* disable pending transactions */transactionID = 0xFF;contextBit = 0xFF;if(uiCompletionCode != 0) {status = -1;printf("SRIO transfer have error completed code %d\r\n", -(uiCompletionCode));goto err_transfer;}break;} else {timeout--;/* delay 1 cpu cyle */asm (" nop");}}if(timeout == 0) {/* if transfer timeout occurs, return error status */status = -1;printf("SRIO transfer timeout\r\n");goto err_transfer;}/* Calculate srio transfer used time */transCost = _itoll(TSCH, TSCL) - transStart;r_time = transCost;/* Calculate srio transfer read rate */r_rate = (float)transfer_size * main_pll_freq / r_time / 1024 / 1024 / 1024 * 8;w_rate_total += w_rate;r_rate_total += r_rate;for(i = 0; i < transfer_size; i++) {if(w_buff_global[i] != r_buff_global[i]) {err_count++;if(err_count == 1) {printf("Frist Err occurred src addr: 0x%x, dst addr: 0x%x\r\n", \(uint32_t)&w_buff_global[i], (uint32_t)&r_buff_global[i]);printf("dst val: 0x%x, ", r_buff_global[i]);printf("expet val: 0x%x\r\n", w_buff_global[i]);}}}printf("=== loop times: %d | err_count: %d | ", j, err_count);if(w_format_type == Srio_Ftype_WRITE)printf("trans_size: %d Byte | NWRITE write times: %d ns(%.2f Gbps) | ", \transfer_size, w_time, w_rate);else if(w_format_type == Srio_Ftype_SWRITE)printf("trans_size: %d Byte | SWRITE write times: %d ns(%.2f Gbps) | ", \transfer_size, w_time, w_rate);printf("NREAD read times: %d ns(%.2f Gbps)\r\n", r_time, r_rate);}err_transfer:free(r_buff);
err_alloc_rbuff:free(w_buff);
err_alloc_wbuff:return status;
}
Doorbell门铃中断
门铃中断基于keystone的demo进行修改,会涉及到三个地方
1.初始化中断函数
2.中断向量表建立
3.中断向量表的链接
1.初始化中断函数
中断部分函数是从keystone的SRIO例子中的SRIO_Test.c中摘抄出来的,原版的主要函数有
SRIO_Interrupts_Init();(初始化设置)
SRIO_Doorbell_ISR();(中断跳转函数)
KeyStone_SRIO_Interrupt_init(SRIO_Interrupt_Cfg * interrupt_cfg);(初始化应用)
以下为我这里修改的初始化,因为不需要message中断所以就只保留了doorbell的4中断。
void SRIO_Interrupts_Init(void)
{/*map SRIO doorbell interrupts to INT4.*/gpCGEM_regs->INTMUX1 = (CSL_GEM_INTDST_N_PLUS_16<<CSL_CGEM_INTMUX1_INTSEL4_SHIFT);//enable INT4CPU_interrupt_enable((1<<4));interrupt_cfg.interrupt_map = interrupt_map;interrupt_cfg.uiNumInterruptMap = sizeof(interrupt_map)/sizeof(SRIO_Interrupt_Map);/*interrupt rate control is not used in this test*/interrupt_cfg.interrupt_rate= NULL;interrupt_cfg.uiNumInterruptRateCfg= 0;interrupt_cfg.doorbell_route_ctl= SRIO_DOORBELL_ROUTE_TO_DEDICATE_INT;}
需要注意的是,中断初始化一定记到放到SRIO初始化后面,否则将会一直中断导致程序死掉。按下图放置
2.中断向量表建立
其实就是需要新建一个文件,小编直接从keystone里面复制粘贴了出来
下列代码是SRIO_vectors.asm的原始内容,由于小编不需要message中断,所以下列的.ref SRIO_Message_ISR需要去掉,然后VEC_ENTRY SRIO_Message_ISR ;interrupt 5改为VEC_DUMMY ;interrupt 5
;create interrupt vector table for C6000 DSP
;--------------------------------------------------------------
;This file can be modified to add Interrupt Service Routine(ISR)
;for an interrupt, the steps are:
;1,reference to the externally defined ISR, for example
; .ref EDMA_ISR
;2,modify the corresponding entry in the interrupt vector table.
; For example, if interrupt 8 is used for EDMA, then you should
; modify the entry number 8 like below:
; VEC_ENTRY EDMA_ISR ;interrupt 8
;--------------------------------------------------------------
;Author: Brighton Feng
;Created on 2010-12-6
;--------------------------------------------------------------;reference to the externally defined ISR.ref _c_int00.ref SRIO_Doorbell_ISR.ref SRIO_Message_ISR.ref Exception_service_routine.ref Nested_Exception_service_routine.ref exception_record.global vectors ;--------------------------------------------------------------.sect ".text"
;create interrupt vector for NMI
NMI_ISR:STW B1,*-B15[1];save some key registers when exception happensMVKL exception_record,B1MVKH exception_record,B1STW B3, *+B1[0]STW A4, *+B1[1]STW B4, *+B1[2]STW B14, *+B1[3]STW B15, *+B1[4];jump to exception service routineMVKL Exception_service_routine, B1MVKH Exception_service_routine, B1B B1LDW *-B15[1],B1NOP 4;--------------------------------------------------------------
;create interrupt vector for reset (interrupt 0)
VEC_RESET .macro addrMVKL addr,B0MVKH addr,B0B B0MVC PCE1,B0NOP 4.align 32.endm;create interrupt vector for other used interrupts
VEC_ENTRY .macro addrSTW B0,*--B15MVKL addr,B0MVKH addr,B0B B0LDW *B15++,B0NOP 4.align 32.endm;create interrupt vector for unused interrupts
VEC_DUMMY .macro
unused_int?:B unused_int? ;dead loop for unused interruptsNOP 5.align 32.endm;--------------------------------------------------------------
;interrupt vector table .sect "vecs".align 1024vectors:VEC_RESET Nested_Exception_service_routine ;Nested exception VEC_ENTRY NMI_ISR ;NMI/ExceptionVEC_DUMMY ;RSVDVEC_DUMMY ;RSVDVEC_ENTRY SRIO_Doorbell_ISR ;interrupt 4VEC_ENTRY SRIO_Message_ISR ;interrupt 5VEC_DUMMY ;interrupt 6VEC_DUMMY ;interrupt 7VEC_DUMMY ;interrupt 8 VEC_DUMMY ;interrupt 9VEC_DUMMY ;interrupt 10VEC_DUMMY ;interrupt 11VEC_DUMMY ;interrupt 12VEC_DUMMY ;interrupt 13VEC_DUMMY ;interrupt 14VEC_DUMMY ;interrupt 15.end
3.中断向量表的链接
其实名字不一定叫这个,这块的主要作用就是把第二步的中断表给应用进去。
需要修改的文件为C66X.cmd,没错,是个cmd文件,用CCS建立项目的时候会自动生成。
如果没有这一步,那么生成的中断将会在0x00800000里循环卡死。
至此,中断完成,跑一下看看结果
完全没问题,DOORBELL被触发!
参考链接: 如何把中断服务程序加载到ISTP中
参考链接: DSP之SRIO通信之DSP端参数设置
相关文章:
DSP芯片C6678的SRIO及其中断跳转的配置
C6678SRIO读写测试门铃中断跳转测试 SRIO简述代码前言SRIO配置原始代码1.使能电源2.初始化SRIO回环修改 3.SRIO测试 Doorbell门铃中断1.初始化中断函数2.中断向量表建立3.中断向量表的链接 本博客基于创龙“678ZH产品线”的SRIO代码,部分参考于网友们的博客…...
MongoDB#常用脚本
批量插入数据脚本 const oneDayAgo new Date(Date.now() - 1 * 24 * 60 * 60 * 1000);const documents []; for (let i 1; i < 100; i) {documents.push({id: i, // 递增的 idcreateTime: oneDayAgo, // 1天前的日期data: Sample data ${i} // 其他字段(可选…...
MySQL 主从集群同步延迟问题分析与解决方案
MySQL 主从复制(Replication)是构建高可用架构的核心技术,但在实际应用中,主从同步延迟(Replication Lag)是常见且棘手的问题。延迟会导致从库数据不一致、读请求返回旧数据,甚至引发业务逻辑错…...
论文笔记(七十二)Reward Centering(五)
Reward Centering(五) 文章概括摘要附录B 理论细节C 实验细节D 相关方法的联系 文章概括 引用: article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan, Yi and Tomar, Manan and Sutton, Richard S},journal{arX…...
FFmpeg 是什么?为什么?怎么用?
摘要:本文介绍了 FFmpeg,一个功能强大的开源多媒体处理工具,广泛应用于视频和音频文件的处理。FFmpeg 支持多种多媒体格式,能够实现视频编码/解码、格式转换、裁剪、合并、音频提取、流媒体处理等功能。本文详细阐述了 FFmpeg 的主…...
雷池WAF动态防护技术实测
作者; Hacker / 0xh4ck3r 介绍 长亭雷池(SafeLine)是由北京长亭科技有限公司耗时近10年研发并推出的Web应用防火墙(WAF),其核心检测能力由智能语义分析算法驱动。雷池旨在为用户提供高质量的Web攻击防护、…...
BUU40 [CSCCTF 2019 Qual]FlaskLight1【SSTI】
模板: {{.__class__.__base__.__subclasses__()[80].__init__.__globals__[__builtins__].eval("__import__(os).popen(type flag.txt).read()")}} 是个空字符串,.__class__代表这个空字符串的类是什么(这里是单引号双引号都行&a…...
【每日八股】Redis篇(二):数据结构
Redis 数据类型? 主要有 STRING、LIST、ZSET、SET 和 HASH。 STRING String 类型底层的数据结构实现主要是 SDS(简单动态字符串),其主要应用场景包括: 缓存对象:可以用 STRING 缓存整个对象的 JSON&…...
VScode+stfp插件,实现文件远程同步保存【2025实操有效】
目录 1 痛点2 准备工作3 操作步骤3.1 第一步,下载STFP插件3.2 第二步,修改配置文件3.3 第三步,测试是否成功 4 后记 1 痛点 我一直用vscode远程连接服务器,传代码文件等到服务器上面,突然有一次服务器那边尽心维修&am…...
115 道 MySQL 面试题,从简单到深入!
1. 什么是数据库事务? 数据库事务是一个作为单个逻辑工作单元执行的一系列操作。事务具有ACID属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性…...
不同安装路径重复R包清理
df <- as.data.frame(installed.packages()) table(duplicated(df$Package)) ids <- df$Package[duplicated(df$Package)] df2 <- subset(df, df$Package %in% ids)...
Grouped-Query Attention(GQA)详解: Pytorch实现
Grouped-Query Attention(GQA)详解 Grouped-Query Attention(GQA) 是 Multi-Query Attention(MQA) 的改进版,它通过在 多个查询头(Query Heads)之间共享 Key 和 Value&am…...
选择排序:简单高效的选择
大家好,今天我们来聊聊选择排序(Selection Sort)算法。这是一个非常简单的排序算法,适合用来学习排序的基本思路和操作。选择排序在许多排序算法中以其直观和易于实现的特点著称,虽然它的效率不如其他高效算法…...
(教程)PDF 字体技术入门
PDF字体技术 许多人觉得PDF字体令人困惑的主要原因在于PDF文件可以使用多种不同的字体技术。PDF文件规范已经存在16年,在此期间,出现了多种不同的字体技术(既有技术方面的原因,也有商业方面的原因)。因此,…...
LabVIEW中CFURL.llb 工具库说明
CFURL.llb 是 LabVIEW 2019 安装目录下 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform\ 路径下的工具库,主要用于处理 LabVIEW 与 URL 相关的操作,涵盖 URL 解析、HTTP 请求发送、数据传输等功能模块,帮助开发者…...
BGP配置华为——路径优选验证
实验拓扑 实验要求 实现通过修改AS-Path属性来影响路径选择实现通过修改Local_Preference属性来影响路径选择实现通过修改MED属性来影响路径选择实现通过修改preferred-value属性来影响路径选择 实验配置与效果 1.改名与IP配置 2.as300配置OSPF R3已经学到R2和R4的路由 3.…...
Linux8-互斥锁、信号量
一、前情回顾 void perror(const char *s);功能:参数: 二、资源竞争 1.多线程访问临界资源时存在资源竞争(存在资源竞争、造成数据错乱) 临界资源:多个线程可以同时操作的资源空间(全局变量、共享内存&a…...
【Springboot3】Springboot3 搭建RocketMQ 最简单案例
说来也奇怪,RocketMQ 不能很好的兼容Springboot3,刚开始上手Springboot3集成RocketMQ会发现总是不能实例化RocketMQTemplate,老是启动时报错。本项目采用Springboot3,JDK21 ,Maven 3.9,提供一个非常简单的示…...
使用docker安装mysql 挂起之后 再次运行无法连接问题
# 首先 vim /usr/lib/sysctl.d/00-system.conf # 在最后面添加 net.ipv4.ip_forward 1 # 然后保存退出,接着重启网络服务 systemctl restart network # 重启以后,输入以下命令,查看IPv4转发状态 sysctl net.ipv4.ip_forward # 显示net.ipv4…...
hot100-二叉树
二叉树 二叉树递归 相当于这个的顺序来回调换 class Solution {private List<Integer> res new ArrayList<>();public List<Integer> inorderTraversal(TreeNode root) {if(root null)return res;inorderTraversal(root.left);res.add(root.val);inorde…...
从零开始用react + tailwindcs + express + mongodb实现一个聊天程序(二)
1.安装mogondb数据库 参考MongoDB安装配置教程(详细版)_mongodb安装详细步骤-CSDN博客 安装mondbcompass数据库连接工具 参考https://www.mongodb.com/zh-cn/docs/compass/current/connect/ 2.后端服务 1.创建src文件夹 并在src文件夹下创建 index…...
基于Spring Boot的党员学习交流平台设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
Plantsimulation中机器人怎么通过阻塞角度设置旋转135°
创建一个这样的简单模型。 检查PickAndPlace的角度表。源位于180的角位置,而物料终结位于90的角位置。“返回默认位置”选项未被勾选。源每分钟生成一个零件。启动模拟时,Plant Simulation会选择两个位置之间的最短路径。示例中的机器人无法绕135的角位…...
2025.2.23机器学习笔记:PINN文献阅读
2025.2.23周报 一、文献阅读题目信息摘要Abstract创新点网络架构架构A架构B架构C 实验结论后续展望 一、文献阅读 题目信息 题目: Physics-Informed Neural Networks for Modeling Water Flows in a River Channel期刊: IEEE TRANSACTIONS ON ARTIFICI…...
关于Postman自动获取token
在使用postman测试联调接口时,可能每个接口都需要使用此接口生成的令牌做Authorization的Bearer Token验证,最直接的办法可能会是一步一步的点击,如下图: 在Authorization中去选择Bearer Token,然后将获取到的token粘贴…...
Android KMP初探
Android KMP初探 前言: 最近线上听了Kotlin官网举行的KMP会议,感觉听神奇的,于是就把官方demo下载下来尝试了一下,下载插件和所需要的依赖都用了很久,但是发现里面的代码很少,于是尝试自己手写了一下&…...
ncDLRES:一种基于动态LSTM和ResNet的非编码RNA家族预测新方法
现有的计算方法主要分为两类:第一类是通过学习序列或二级结构的特征来预测ncRNAs家族,另一类是通过同源序列之间的比对来预测ncRNAs家族。在第一类中,一些方法通过学习预测的二级结构特征来预测ncRNAs家族。二级结构预测的不准确性可能会导致…...
前端项目打包过滤指定icon文件
1.需求背景 项目中有部分功能需要vip权限才可以使用,所有部分筛选、按钮 等有vip的icon提示 如下图 此项目衍生出一个特殊版本,此版本无需登录且拥有最高权限,所以产品要求去除项目中的所有vip相关的提示。 2.解决思路 (1&am…...
蓝桥杯 Java B 组之最短路径算法(Dijkstra、Floyd-Warshall)
Day 2:最短路径算法(Dijkstra、Floyd-Warshall) 📖 一、最短路径算法简介 最短路径问题是图论中的经典问题,主要用于求解 单源最短路径 或 多源最短路径。在实际应用中,最短路径广泛应用于 导航系统、网络…...
科普:HTTP端口80和HTTPS端口443
你会发现,有的网址不带端口号,怎么回事? HTTP协议默认端口:HTTP协议的默认端口是80。当用户在浏览器中输入一个没有指定端口的以http://开头的网址时,浏览器会自动使用80端口与服务器建立连接,进行超文本数…...
如何安装vm和centos
安装 VMware Workstation Pro 步骤 1:下载 VMware Workstation Pro 访问 VMware 官方网站(Desktop Hypervisor Solutions | VMware ),根据你的操作系统选择合适的版本进行下载。 步骤 2:运行安装程序 找到下载的安装…...
鸿蒙-验证码输入框的几种实现方式-上
文章目录 效果图、优缺点多TextInput多 TextCanvas 绘制 多个 TextInput 拼接放置四个输入框焦点移动输入时向后移动输入完成回调删除时向前移动 防止点击总结 最近在做应用鸿蒙化,说白了就是把原来Android、iOS的代码重新用ArkTS写一遍,我负责基础建设和…...
Vi 编辑器基本使用指南
一、Vi 编辑器的启动与退出 启动 Vi 编辑器 在终端中,输入vi加上要编辑的文件名,如vi example.txt,如果example.txt存在,Vi 编辑器会打开该文件;若不存在,则会创建一个新的空文件并打开。如果只输入vi&am…...
centos 7 安装python3 及pycharm远程连接方法
安装openssl 使用pip3安装 virtualenv的时候会提示WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. 这是因为缺少openssl 2.0以上版本 解决办法: 一、先确认版本 openssl version 二、安…...
PostgreSQL 使用pgAdmin 4 数据库还原sql文件报错问题分析
sql执行报错问题: C:\Program Files\PostgreSQL\17\bin\pg_restore.exe --host "localhost" --port "5433" --username "postgres" --no-password --dbname "ry_postgresql-final" --verbose "E:\\PostgreSQLProject\\Ruoyi-Po…...
gihub上适合练手的Python项目
GitHub 上有许多适合练手的 Python 项目,涵盖了从初学者到中级开发者的不同难度级别。以下是一些推荐的项目类型和具体示例,帮助你提升 Python 编程技能: 1. 基础项目 适合初学者,帮助掌握 Python 基础语法和常用库。 示例项目&…...
3D Web轻量化引擎HOOPS Communicator如何赋能航空航天制造?
在当今航空航天制造领域,精确度、效率和协作是推动行业发展的关键要素。随着数字化技术的飞速发展,3D Web可视化开发包HOOPS Communicator 为航空航天制造带来了革命性的变化。它凭借强大的功能和灵活的应用,助力企业在设计、生产、培训等各个…...
AWQ和GPTQ量化的区别
一、前言 本地化部署deepseek时发现,如果是量化版的deepseek,会节约很多的内容,然后一般有两种量化技术,那么这两种量化技术有什么区别呢? 二、量化技术对比 在模型量化领域,AWQ 和 GPTQ 是两种不同的量…...
通过恒定带宽服务器调度改进时间敏感网络(TSN)流量整形
论文标题 英文标题:Improving TSN Traffic Shaping with Constant Bandwidth Server Scheduling 中文标题:通过恒定带宽服务器调度改进时间敏感网络(TSN)流量整形 作者信息 作者:Benjamin van Seggelen 指导教师&am…...
气象干旱触发水文(农业)干旱的概率及其触发阈值的动态变化-贝叶斯copula模型
前言 在干旱研究中,一个关键的科学问题是:在某一地区发生不同等级的气象干旱时,气象干旱会以何种概率引发不同等级的水文干旱、农业干旱和地下水干旱?换句话说,气象干旱的不同程度会分别引发其他类型干旱的哪种等级&a…...
自定义Spring Boot Starter(官网文档解读)
摘要 本文将详细介绍自定义 Spring Boot Starter 的完整过程。要构建自定义 Starter,首先需掌握 Spring Boot 中 Auto-configuration 以及相关注解的工作原理,同时了解 Spring Boot 提供的一系列条件注解。在具备这些知识基础后,再按照特定步…...
开发 picgo-plugin-huawei 插件,解决华为云社区外链限制问题
开发 picgo-plugin-huawei 插件,解决华为云社区外链限制问题 在技术博客平台中,外链的使用常常受到限制,这给我们的写作和内容展示带来了一定的不便。为了应对这一问题,我开发了 picgo-plugin-huawei 插件,它能够有效…...
最长回文子串
标题 1.1 问题描述 给你一个字符串 s,找到 s 中最长的回文子串。 1.2 示例 1.2.1 示例1 输入:s “babad” 输出:“bab” 解释:“aba” 同样是符合题意的答案。 1.2.2 示例2 输入:s “cbbd” 输出:“bb…...
JavaSE学习笔记26-集合(Collection)
集合 Java 中的集合(Collection)是 Java 标准库中非常重要的一部分,用于存储和操作一组对象。Java 集合框架(Java Collections Framework)提供了一套丰富的接口和类,用于处理各种数据结构,如列…...
开源神器KRR:用数据驱动K8s资源优化
引言:云原生时代的资源管理之痛 在Kubernetes集群中,过度配置导致资源浪费与配置不足引发稳定性风险的矛盾始终存在。CNCF调研显示,企业平均有35%的云资源处于闲置状态。本文将揭秘开源神器KRR(Kubernetes Resource Recommender),通过数据驱动方式实现精准资源配置,实测…...
微信小程序:多菜单栏设计效果
一、实现效果 二、代码 wxml 编辑前端界面,步骤 菜单逻辑: 逐步取出数组中的项,首先取出顶部菜单项,然后选中后取出选中的底部数据(左侧菜单+右侧内容),然后点击左侧菜单取出选中的左侧菜单对应的右侧内容 ①这里我的数据是全部封装到一个数组对象的,首先我的循环…...
网络安全-js安全知识点与XSS常用payloads
简介 JavaScript 是一种轻量级的编程语言,定义了HTML的行为。它与Java的关系类似周杰和周杰伦的关系(即没有关系)。 用法 HTML 中的脚本必须位于 <script> 与 </script> 标签之间。 脚本可被放置在 HTML 页面的 <body>…...
无人机实战系列(二)本地摄像头 + Depth-Anything V2
这篇文章介绍了如何在本地运行 Depth-Anything V2,因为我使用的无人机是Tello,其本身仅提供了一个单目视觉相机,在众多单目视觉转 Depth 的方案中我选择了 Depth-Anything V2,这个库的强大在于其基于深度学习模型将单目视觉以较低…...
[杂学笔记]工厂模式、多态、内存空间区域划分、cp指令破坏软连接问题、UDP如何实现可靠传输、滑动窗口的原理、进程与线程、线程之间的通信
目录 1.工厂模式 2.多态 3.内存空间区域划分 4.cp指令破坏软连接问题 5.UDP实现可靠传输 6.滑动窗口的原理 7.进程与线程 8.线程之间的通信 1.工厂模式 工厂模式是一种创建对象的设计模式。它提供了一种创建对象的方式,将对象的创建和使用分离,通…...
【IEEE出版,往届会后3个月EI检索 | 西华大学主办 | 中英文期刊、SCI期刊推荐】第四届能源、电力与电气国际学术会议(ICEPET 2025)
第四届能源、电力与电气国际学术会议(ICEPET 2025)由西华大学主办,西华大学能源与动力工程学院、西华大学电气与电子信息学院、西华大学航空航天学院、流体及动力机械教育部重点实验室、流体机械及工程四川省重点实验室、四川省水电能源动力装…...