3、CC3200串口DMA

先說下CC3200存在2個16*8的fifos, 分別用于發送和接收

當fifos被disable時,將會作為一個1字節深度的保持寄存器,

所以無論fifos是開是關,發送和接收都繞不開fifos

DMA

由于發送和接收都繞不過fifos,所以DMA也繞不開FIFOS.

MAP_UARTFIFOLevelSet(UARTA0_BASE, UART_FIFO_TX4_8, UART_FIFO_RX4_8);

上述代碼的意思就是,設定FIFO,UART_FIFO_TX4_8當達到1/2 * 16字節時才會觸發DMA傳輸,小于8字節時不觸發DMA傳輸,所以這個時候要用到UART外設自帶的接收超時中斷,類似于STM32的idle中斷.

需要注意的是,觸發DMA后,僅僅是把數據從uart外設寄存器搬運到了用戶指定的ram中

DMA中也有一個閾值參數,叫做仲裁大小,他決定了DMA每次最多連續搬運字節數.仲裁大小別稱ARB, ARB<=FIFO閾值

所以在傳輸1024字節數據時,ARB設定為32,DMA就會以32字節為單位進行數據搬運

此外,在手冊里有如下說明.

The arbitration size can also be thought of as a burst size, as it is the maximum number of items that are transferred at any one time in a burst. Here, the term arbitration refers to determination of μDMA channel priority, not arbitration for the bus. When the μDMA controller arbitrates for the bus, the processor always takes priority. Furthermore, the μDMA controller is held off whenever the processor must perform a bus transaction on the same bus, even in the middle of a burst transfer.

即對于總線競爭時,CPU > DMA, 上面的ARB大小的仲裁僅為DMA多通道之間優先級的仲裁,每搬運ARB SIZE大小的數據后檢查一次DMA通道的優先級.

DMA

串口超時中斷

UART的超時中斷觸發條件

這個和32的IDLE功能類似,但是觸發機制完全不同.

32是超過一定時間沒接收數據就觸發,但是觸發后除非再次接收到數據否則不會再觸發

這個觸發機制看原文描述

The receive timeout interrupt is asserted when the receive FIFO is not empty

and no further data is received over a 32-bit period when the HSE bit is clear, or over a 64-bit period when the HSE bit is set

即滿足FIFO不為空,且在32周期或者64周期沒接收(根據HSE位區分)FIFO數據。簡單理解只要FIFO內存在數據超過一定時間就會觸發,如果你一直不接受數據,則一直觸發哪怕清除中斷位后還是會不停觸發.4

這個和FIFO閾值及ARB強相關。

FIFO閾值決定了FIFO達到多少數據觸發DMA搬運,ARB決定了DMA單次搬運的數據大小.

舉兩個例子

FIFO = 1/8觸發,ARB = 2 則僅在FIFO剩余1個字節時觸發RT,為什么使用FIFO僅剩1個字節的字眼,因為當你單次發送奇數時即會觸發該中斷.

FIFO = 1/4觸發,ARB = 2 ,FIFO字節大于等于4觸發,每次搬運2個,即無論發送多少個都會觸發RT中斷

所以設定fifo要注意,如果fifo大小和URB大小一致,會導致發送數據為URB大小時,數據被完全搬運到了緩存,導致不觸發RT中斷.

DMARX_INT

這個也是串口的中斷,體現在代碼中叫做UART_INT_DMARX

這個中斷在手冊中描述如下

If DMA is enabled, then the μDMA controller triggers an interrupt when a transfer is complete. The
interrupt occurs on the UART interrupt vector. Therefore, if interrupts are used for UART operation and
DMA is enabled, the UART interrupt handler must be designed to handle the μDMA completion interrupt.

經過實際測試,在基礎模式下,這個在僅在dma傳輸完成設定大小的數據后觸發.

CC3200的DMA中斷和STM32不太一樣

參考文檔給出說明如下所示

Few μDMA channels are dedicated to software-initiated transfers. This channel also has a dedicated
interrupt to signal completion of a μDMA transfer. A transfer is initiated by software by first configuring and
enabling the transfer, and then issuing a software request using the DMA Channel Software Request
(DMASWREQ) register. For software-based transfers, use the auto transfer mode.

When a μDMA transfer is complete, a dma_done signal is sent to the peripheral that initiated the μDMA
event. Interrupts can be enabled within the peripheral to trigger on μDMA transfer completion. If the
transfer uses the software μDMA channel, then the completion interrupt occurs on the dedicated software
μDMA interrupt vector.

可以看到DMA的中斷僅針對軟件dma有用,也就是說僅針對m to m有用,針對外設相關DMA,所有中斷都發送到外設自己的中斷內處理.

此外,本來想使用ping-pong模式,但是調試了1天在最開始接受的幾組數據中始終會有丟包現象,不知道哪地方的設置出問題了,所以最后選用了基礎模式.

示例1 測試rx及dmarx的功能

本demo測試基本dma傳輸.

主要測試超時中斷及uart_dmarx

// Driverlib includes
#include "hw_types.h"
#include "hw_uart.h"
#include "hw_ints.h"
#include "hw_memmap.h"
#include "hw_common_reg.h"
#include "interrupt.h"
#include "hw_apps_rcm.h"
#include "prcm.h"
#include "rom.h"
#include "prcm.h"
#include "rom_map.h"
#include "gpio.h"
#include "utils.h"
#include "uart.h"
#include "udma.h"// user includes
#include "pin_mux_config.h"
#include "uart_if.h"
#include "systick_if.h"
#include "wifi.h"
#include "wlan.h"
#include "stdio.h"
#include "udma_if.h"
//*****************************************************************************
//                 GLOBAL VARIABLES -- Start
//*****************************************************************************
#if defined(ccs)extern void (* const g_pfnVectors[])(void);
#endif
#if defined(ewarm)extern uVectorEntry __vector_table;
#endif
//*****************************************************************************
//                 GLOBAL VARIABLES -- End
//*****************************************************************************//*****************************************************************************
//                      LOCAL FUNCTION PROTOTYPES
//*****************************************************************************
void LEDBlinkyRoutine();
static void BoardInit(void);//*****************************************************************************
//                      LOCAL FUNCTION DEFINITIONS
//*****************************************************************************//*****************************************************************************static void BoardInit(void)
{/* In case of TI-RTOS vector table is initialize by OS itself */
#ifndef USE_TIRTOS//// Set vector table base//
#if defined(ccs)MAP_IntVTableBaseSet((unsigned long)&g_pfnVectors[0]);
#endif
#if defined(ewarm)MAP_IntVTableBaseSet((unsigned long)&__vector_table);
#endif
#endif//// Enable Processor//MAP_IntMasterEnable();MAP_IntEnable(FAULT_SYSTICK);PRCMCC3200MCUInit();
}
extern void tcp_rate_test_example(wifi_t wifi);
extern void cw_burst_forever();
#define UART_TXBUF_SIZE (256)
#define UART_RXBUF_SIZE (256)
static unsigned char g_ucTxBuf[UART_TXBUF_SIZE];
static unsigned char g_ucRxBufA[UART_RXBUF_SIZE];
static unsigned char g_ucRxBufB[UART_RXBUF_SIZE];
void
UART0IntHandler(void)
{static long recv_cnt = 0;unsigned long ulStatus;unsigned long ulMode;long cnt = 0;//// Read the interrupt status of the UART.//ulStatus = MAP_UARTIntStatus(UARTA0_BASE, 1);//// Clear any pending status, even though there should be none since no UART// interrupts were enabled.  //MAP_UARTIntClear(UARTA0_BASE, ulStatus);ulMode = MAP_uDMAChannelModeGet(UDMA_CH8_UARTA0_RX);if(ulMode == UDMA_MODE_STOP){Report("dma restart\r\n");//// Set up the next transfer for the "A" buffer, using the primary// control structure.  When the ongoing receive into the "B" buffer is// done, the uDMA controller will switch back to this one.  //UDMASetupTransfer(UDMA_CH8_UARTA0_RX, UDMA_MODE_BASIC,8,UDMA_SIZE_8, UDMA_ARB_4,(void *)(UARTA0_BASE + UART_O_DR), UDMA_SRC_INC_NONE,g_ucRxBufA, UDMA_DST_INC_8);// return;}if(ulStatus & UART_INT_RT) {while(MAP_UARTCharsAvail(UARTA0_BASE)) {uint8_t data = MAP_UARTCharGetNonBlocking(UARTA0_BASE);cnt ++;Report("cnt %d:0x%02x\r\n", cnt, data);if (cnt > 5)break;}}else if (ulStatus & UART_INT_DMARX){Report("rx int\r\n");}}
voidInitUART0Transfer(void)
{unsigned int uIdx;//// Fill the TX buffer with a simple data pattern.//for(uIdx = 0; uIdx < UART_TXBUF_SIZE; uIdx++){g_ucTxBuf[uIdx] = 65;}MAP_PRCMPeripheralReset(PRCM_UARTA0);MAP_PRCMPeripheralClkEnable(PRCM_UARTA0,PRCM_RUN_MODE_CLK);MAP_UARTConfigSetExpClk(CONSOLE,SYSCLK, UART_BAUD_RATE,(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |UART_CONFIG_PAR_NONE));MAP_uDMAChannelAssign(UDMA_CH8_UARTA0_RX);MAP_uDMAChannelAssign(UDMA_CH9_UARTA0_TX);MAP_UARTIntRegister(UARTA0_BASE,UART0IntHandler);//// Set both the TX and RX trigger thresholds to 4.  This will be used by// the uDMA controller to signal when more data should be transferred.  The// uDMA TX and RX channels will be configured so that it can transfer 4// bytes in a burst when the UART is ready to transfer more data.//MAP_UARTFIFOLevelSet(UARTA0_BASE, UART_FIFO_TX4_8, UART_FIFO_RX2_8);//// Enable the UART for operation, and enable the uDMA interface for both TX// and RX channels.//MAP_UARTEnable(UARTA0_BASE);//// Enable the UART peripheral interrupts. uDMA controller will cause an // interrupt on the UART interrupt signal when a uDMA transfer is complete.//MAP_UARTIntEnable(UARTA0_BASE,UART_INT_DMARX);MAP_UARTIntEnable(UARTA0_BASE,UART_INT_RT);UDMASetupTransfer(UDMA_CH8_UARTA0_RX,UDMA_MODE_BASIC,//                      sizeof(g_ucRxBufA),8,UDMA_SIZE_8,UDMA_ARB_4,(void *)(UARTA0_BASE+UART_O_DR),UDMA_SRC_INC_NONE,(void *)g_ucRxBufA,UDMA_DST_INC_8);MAP_UARTDMAEnable(UARTA0_BASE,UART_DMA_RX);
}void main()
{BoardInit();PinMuxConfig();SysTickInit();InitTerm();UDMAInit();// wifi_t wifi = wifi_create();
#define GPIOSetLevel(gpio_port, gpio_pin, value) GPIOPinWrite(gpio_port, gpio_pin, value != 0 ? gpio_pin : 0)// wifi_connect(wifi, "ultra-wifi", "ultra@2021", SL_SEC_TYPE_WPA_WPA2);// wifi_connect(wifi, "360WiFi-864040", "87654321", SL_SEC_TYPE_WPA_WPA2);// wifi_connect(wifi, "quanjing_test", "Iot@tytc00!", SL_SEC_TYPE_WPA_WPA2);InitUART0Transfer();while (1){// cw_burst_forever();// tcp_rate_test_example(wifi);// GPIOSetLevel(GPIOA1_BASE, GPIO_PIN_1, !GPIOPinRead(GPIOA1_BASE,GPIO_PIN_1));// UTUtilsDelay(10000 * 1000);}
}

示例2 測試basic dma2M全速接收串口數據

// Driverlib includes
#include "hw_types.h"
#include "hw_memmap.h"
#include "rom_map.h"
#include "prcm.h"#include "hw_uart.h"
#
#include "uart.h"
#include "udma.h"// sdk user includes
#include "uart_if.h"
#include "udma_if.h"
#include "systick_if.h"// user includes
#include "uart_itf.h"
#include "RingBuf.h"
#undef UART_BAUD_RATE
// #define UART_BAUD_RATE  115200
#define UART_BAUD_RATE  2000000
#define SYSCLK          80000000#define UART_TXBUF_SIZE (1024)
#define UART_RXBUF_SIZE (1024)
static unsigned char g_ucRxBufA[UART_RXBUF_SIZE];static rb_t rb;
static unsigned char rx_data[UART_RXBUF_SIZE * 100];static uint64_t last_time = 0;
static void UARTIntHandler(void)
{unsigned long ulStatus;unsigned long ulMode;ulStatus = MAP_UARTIntStatus(UART_ITF_BASE, 1);MAP_UARTIntClear(UART_ITF_BASE, ulStatus);Report("ulStatus:%x\r\n", ulStatus);if (ulStatus & UART_INT_DMARX){       ulMode = MAP_uDMAChannelModeGet(UART_ITF_RX_DMA_CH);if(ulMode == UDMA_MODE_STOP){rbWrite(&rb, g_ucRxBufA, UART_RXBUF_SIZE);UDMASetupTransfer(UART_ITF_RX_DMA_CH,UDMA_MODE_BASIC,sizeof(g_ucRxBufA),//    8,UDMA_SIZE_8,UDMA_ARB_8,(void *)(UART_ITF_BASE+UART_O_DR),UDMA_SRC_INC_NONE,(void *)g_ucRxBufA,UDMA_DST_INC_8);}}else if(ulStatus & UART_INT_RT) {UDMAStopTransfer(UART_ITF_RX_DMA_CH);uint32_t received = UART_RXBUF_SIZE - MAP_uDMAChannelSizeGet(UART_ITF_RX_DMA_CH);if (received != 0 && received <=  UART_RXBUF_SIZE){rbWrite(&rb, g_ucRxBufA, received);UDMASetupTransfer(UART_ITF_RX_DMA_CH,UDMA_MODE_BASIC,sizeof(g_ucRxBufA),//    8,UDMA_SIZE_8,UDMA_ARB_8,(void *)(UART_ITF_BASE+UART_O_DR),UDMA_SRC_INC_NONE,(void *)g_ucRxBufA,UDMA_DST_INC_8);}while(MAP_UARTCharsAvail(UART_ITF_BASE)) {uint8_t data = MAP_UARTCharGetNonBlocking(UART_ITF_BASE);rbWrite(&rb, &data, 1);}}}void uart_itf_init(void)
{UDMAInit();MAP_PRCMPeripheralReset(UART_ITF_PRCM);MAP_PRCMPeripheralClkEnable(UART_ITF_PRCM,PRCM_RUN_MODE_CLK);MAP_UARTConfigSetExpClk(UART_ITF_BASE,SYSCLK, UART_BAUD_RATE,(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |UART_CONFIG_PAR_NONE));MAP_uDMAChannelAssign(UART_ITF_RX_DMA_CH);// MAP_uDMAChannelAssign(UART_ITF_TX_DMA_CH);MAP_UARTIntRegister(UART_ITF_BASE,UARTIntHandler);MAP_UARTFIFOLevelSet(UART_ITF_BASE, UART_FIFO_TX4_8, UART_FIFO_RX4_8);MAP_UARTEnable(UART_ITF_BASE);MAP_UARTIntEnable(UART_ITF_BASE,UART_INT_DMARX | UART_INT_RT);UDMASetupTransfer(UART_ITF_RX_DMA_CH,UDMA_MODE_BASIC,sizeof(g_ucRxBufA),//    8,UDMA_SIZE_8,UDMA_ARB_8,(void *)(UART_ITF_BASE+UART_O_DR),UDMA_SRC_INC_NONE,(void *)g_ucRxBufA,UDMA_DST_INC_8);MAP_UARTDMAEnable(UART_ITF_BASE,UART_DMA_RX);rbInit(&rb, rx_data, sizeof(rx_data));
}int32_t uart_itf_get_can_read(void)
{return rbCanRead(&rb);
}int32_t uart_itf_recv(void *data, uint32_t count)
{return rbRead(&rb, data, count);
}int32_t uart_itf_send(void *data, uint32_t count)
{for (int i = 0; i < count; i++){while (UARTBusy(UART_ITF_BASE));UARTCharPut(UART_ITF_BASE, ((uint8_t *)data)[i]);}return count;
}#define SEND_CHUNK_SIZE 1460
void test_uart_recv_basic_process()
{uart_itf_init();uint64_t total_bytes = 0;uint64_t max_size = 0;uint64_t old_time = UTUtilsGetSysTime();uint64_t new_time = 0;char buf[SEND_CHUNK_SIZE * 3] = {0};while(1){long size = uart_itf_get_can_read();if (size > 0){long len = uart_itf_recv(buf, (size > sizeof(buf)) ? sizeof(buf) : size);total_bytes += len;max_size = size > max_size ? size : max_size;Report("t:%lld l:%ld %ld %ld\r\n", total_bytes, len, size, max_size);old_time = new_time;}new_time = UTUtilsGetSysTime();if (new_time - old_time > 800){total_bytes = 0;max_size = 0;old_time = new_time;}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917122.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917122.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917122.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從游戲NPC到手術助手:Agent AI重構多模態交互,具身智能打開AGI新大門

注&#xff1a;此文章內容均節選自充電了么創始人&#xff0c;CEO兼CTO陳敬雷老師的新書《GPT多模態大模型與AI Agent智能體》&#xff08;跟我一起學人工智能&#xff09;【陳敬雷編著】【清華大學出版社】 清華《GPT多模態大模型與AI Agent智能體》書籍配套視頻課程【陳敬雷…

Lesson 29 Taxi!

Lesson 29 Taxi! taxi n.出租車 同義詞:cab n.出租車 相關:taxi meter計價器 taxi stand taxi rank 出租車站 call ataxi 叫車&#xff0c;打車 例句:對不起,請問出租車站在哪里? Excuse me, do you know where the taxi rank is please? land v.著陸&#xff0c;登陸n.陸地…

怎樣將allegro的brd文件轉化為AD的PCB文件

由于工作需要將allegro的PCB轉成ad給同事&#xff0c;在使用AD軟件導入Allegro的brd格式文件時出現各種的異常報錯彈窗問題&#xff0c;現分享兩種將Allegro PCB文件導入到AD中的方法。一、第1種方法使用高版本的AD軟件&#xff08;AD22&#xff0c;同時操作電腦需安裝了Allegr…

[免費]【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts)【論文+源碼+SQL腳本】

大家好&#xff0c;我是python222_小鋒老師&#xff0c;看到一個不錯的【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)&#xff0c;分享下哈。 項目視頻演示 【免費】【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts爬蟲) Pytho…

什么是CI/CD?

CI/CD是持續集成&#xff08;Continuous Integration&#xff09;和持續交付/持續部署&#xff08;Continuous Delivery/Continuous Deployment&#xff09;的縮寫&#xff1a;持續集成&#xff08;Continuous Integration, CI&#xff09;&#xff1a;CI是一種開發實踐&#x…

【Linux】重生之從零開始學習運維之Mysql

一主一從主12主機準備工作mkdir -p /data/mysql/logbin chown -R mysql:mysql /data/mysql主節點mysql配置vim /etc/my.cnf.d/mysql-server.cnf server-id177 log_bin/data/mysql/logbin/mysql-bin default_authentication_pluginmysql_native_password查看效果systemctl resta…

Trust Management System (TMS)

Trust Management System &#xff08;TMS&#xff09;信托管理系統學習信托管理系統&#xff08;TMS&#xff09;是一種用于高效管理信托業務的綜合平臺&#xff0c;涵蓋客戶信息、資產配置、風險監控等功能。通過學習TMS&#xff0c;可以掌握信托產品設計、業務流程優化及合規…

Spring Boot中使用Bouncy Castle實現SM2國密算法(與前端JS加密交互)

Spring Boot中使用Bouncy Castle實現SM2國密算法&#xff08;與前端JS加密交互&#xff09;一、環境準備二、核心實現三、前后端交互流程四、關鍵問題解決方案五、常見問題排查六、最佳實踐建議在現代Web應用中&#xff0c;數據安全傳輸至關重要。SM2作為我國自主設計的非對稱加…

機器學習sklearn:隨機森林的決策樹

bg&#xff1a;對比決策樹來說&#xff0c;搞多幾棵樹就是隨機森林了rlf_1 [] rlf_2 [] for i in range(10):rfc RandomForestClassifier(n_estimators25)rfc_s cross_val_score(rfc, wine.data, wine.target, cv10).mean()rlf_1.append(rfc_s)clf DecisionTreeClassifier…

上海月賽kk

1.十六進制#include<bits/stdc.h> using namespace std;int n;int main(){cin>>n;stack<int>re;if(n<16)cout<<0;while(n){re.push(n%16);n/16;}while(!re.empty()){int xre.top();re.pop();if(x<10)cout<<x;else cout<<char(Ax-10)…

暑期算法訓練.12

目錄 52. 力扣1 兩數之和 52.1 題目解析&#xff1a; 52.2 算法思路&#xff1a; 52.3 代碼演示&#xff1a; ?編輯 52.4 總結反思&#xff1a; 53 面試題&#xff1a;判定是否互為字符重排 53.1 題目解析&#xff1a; 53.2 算法思路&#xff1a; 53.3 代碼演示&…

MySQL時間處理完全指南:從存儲到查詢優化

時間是數據庫中最活躍的數據維度之一&#xff0c;正確處理時間數據關系到系統穩定性、數據分析準確性和業務邏輯正確性。本文將深入剖析MySQL時間處理的完整知識體系。一、MySQL時間數據類型詳解1. 核心時間類型對比類型存儲空間范圍特性時區影響DATE3字節1000-01-01~9999-12-3…

Text2SQL 智能問答系統開發-預定義模板(二)

背景 在構建一個支持多輪對話的 Text2SQL 系統過程中&#xff0c;我完成了以下關鍵功能&#xff1a; 已完成 基礎 Text2SQL 功能實現 實現用戶輸入自然語言問題后&#xff0c;系統能夠自動生成 SQL 并執行返回結果。用戶交互優化 支持用戶通過補充信息對查詢進行調整&#xff0…

JavaScript 異步編程:Promise 與 async/await 詳解

一、Promise 1. 什么是 Promise&#xff1f; Promise 是 JavaScript 中用于處理異步操作的對象&#xff0c;它代表一個異步操作的最終完成&#xff08;或失敗&#xff09;及其結果值。 2. Promise 的三種狀態 ??Pending&#xff08;待定&#xff09;??&#xff1a;初始狀態…

OS架構整理

OS架構整理引導啟動部分bios bootloader區別啟動流程&#xff08;x86 BIOS 啟動&#xff09;&#xff1a;biosboot_loader3.切換進保護模式實模式的限制如何切換進保護模式加載kernel到內存地址1M加載內核映像文件elf一些基礎知識鏈接腳本與代碼數據段創建GDT表段頁式內存管理顯…

【WRF-Chem第二期】WRF-Chem有關 namelist 詳解

目錄namelist 選項&#xff1a;chem_opt 的選擇其他化學相關的 namelist 選項氣溶膠光學屬性與輸出邊界與初始條件配置&#xff08;氣體&#xff09;參考本博客詳細介紹 WRF-Chem有關 namelist 選項。 namelist 選項&#xff1a;chem_opt 的選擇 chem_opt 是什么&#xff1f;…

STM32-USART串口實現接收數據三種方法(1.根據\r\n標志符、2.空閑幀中斷、3.根據定時器輔助接收)

本章概述思維導圖&#xff1a;USART串口初始化配置串口初始化配置在&#xff08;STM32-USART串口初始化章節有詳細教程配置&#xff09;&#xff0c;本章不做講解直接代碼示例&#xff0c;本章重點在于串口實現接收數據三種方法&#xff1b;配置USART1串口接收初始化函數步驟&a…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 微博評論數據可視化分析-點贊區間折線圖實現

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解微博評論數據可視化分析-點贊區間折線圖實現…

Unity_SRP Batcher

SRP Batcher 全面解析&#xff1a;原理、啟用、優化與調試一、什么是 SRP Batcher&#xff1f;SRP Batcher 是 Unity Scriptable Render Pipeline&#xff08;URP、HDRP 或自定義 SRP&#xff09; 專屬的 CPU 渲染性能優化技術&#xff0c;核心目標是 減少材質切換時的 CPU 開銷…

詳解Vite 配置中的代理功能

在前端開發過程中&#xff0c;你可能經常會遇到一個頭疼的問題&#xff1a;當你在本地啟動的前端項目中調用后端接口時&#xff0c;瀏覽器控制臺會報出類似 “Access to fetch at ‘http://xxx’ from origin ‘http://localhost:3000’ has been blocked by CORS policy” 的錯…