在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ThreadLocal是什么

jf_ro2CN3Fa ? 來(lái)源:CSDN ? 2023-01-30 11:36 ? 次閱讀


ThreadLocal是什么

ThreadLocal是一個(gè)本地線程副本變量工具類(lèi)。主要用于將私有線程和該線程存放的副本對(duì)象做一個(gè)映射,各個(gè)線程之間的變量互不干擾,在高并發(fā)場(chǎng)景下,可以實(shí)現(xiàn)無(wú)狀態(tài)的調(diào)用,特別適用于各個(gè)線程依賴(lài)不通的變量值完成操作的場(chǎng)景。

下圖為T(mén)hreadLocal的內(nèi)部結(jié)構(gòu)圖

931b2958-9fb9-11ed-bfe3-dac502259ad0.png

從上面的結(jié)構(gòu)圖,我們已經(jīng)窺見(jiàn)ThreadLocal的核心機(jī)制:

  • 每個(gè)Thread線程內(nèi)部都有一個(gè)Map。
  • Map里面存儲(chǔ)線程本地對(duì)象(key)和線程的變量副本(value)
  • 但是,Thread內(nèi)部的Map是由ThreadLocal維護(hù)的,由ThreadLocal負(fù)責(zé)向map獲取和設(shè)置線程的變量值。

所以對(duì)于不同的線程,每次獲取副本值時(shí),別的線程并不能獲取到當(dāng)前線程的副本值,形成了副本的隔離,互不干擾。

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶(hù)小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶(hù)、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

ThreadLocalMap

932a8d58-9fb9-11ed-bfe3-dac502259ad0.png

ThreadLocalMap是ThreadLocal的內(nèi)部類(lèi),沒(méi)有實(shí)現(xiàn)Map接口,用獨(dú)立的方式實(shí)現(xiàn)了Map的功能,其內(nèi)部的Entry也獨(dú)立實(shí)現(xiàn)。

和HashMap的最大的不同在于,ThreadLocalMap結(jié)構(gòu)非常簡(jiǎn)單,沒(méi)有next引用,也就是說(shuō)ThreadLocalMap中解決Hash沖突的方式并非鏈表的方式,而是采用線性探測(cè)的方式。(ThreadLocalMap如何解決沖突?

在ThreadLocalMap中,也是用Entry來(lái)保存K-V結(jié)構(gòu)數(shù)據(jù)的。但是Entry中key只能是ThreadLocal對(duì)象,這點(diǎn)被Entry的構(gòu)造方法已經(jīng)限定死了。

staticclassEntryextendsWeakReference<ThreadLocal>{
/**ThevalueassociatedwiththisThreadLocal.*/
Objectvalue;

Entry(ThreadLocalk,Objectv){
super(k);
value=v;
}
}

注意了!!

Entry繼承自WeakReference(弱引用,生命周期只能存活到下次GC前),但只有Key是弱引用類(lèi)型的,Value并非弱引用。(問(wèn)題馬上就來(lái)了)

由于ThreadLocalMap的key是弱引用,而Value是強(qiáng)引用。這就導(dǎo)致了一個(gè)問(wèn)題,ThreadLocal在沒(méi)有外部對(duì)象強(qiáng)引用時(shí),發(fā)生GC時(shí)弱引用Key會(huì)被回收,而Value不會(huì)回收。

當(dāng)線程沒(méi)有結(jié)束,但是ThreadLocal已經(jīng)被回收,則可能導(dǎo)致線程中存在ThreadLocalMap的鍵值對(duì),造成內(nèi)存泄露。(ThreadLocal被回收,ThreadLocal關(guān)聯(lián)的線程共享變量還存在)。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶(hù)小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶(hù)、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

如何避免泄漏

為了防止此類(lèi)情況的出現(xiàn),我們有兩種手段。

1、使用完線程共享變量后,顯示調(diào)用ThreadLocalMap.remove方法清除線程共享變量;

既然Key是弱引用,那么我們要做的事,就是在調(diào)用ThreadLocal的get()set()方法時(shí)完成后再調(diào)用remove方法,將Entry節(jié)點(diǎn)和Map的引用關(guān)系移除,這樣整個(gè)Entry對(duì)象在GC Roots分析后就變成不可達(dá)了,下次GC的時(shí)候就可以被回收。

2、JDK建議ThreadLocal定義為private static,這樣ThreadLocal的弱引用問(wèn)題則不存在了。

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 變量
    +關(guān)注

    關(guān)注

    0

    文章

    614

    瀏覽量

    28846
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    507

    瀏覽量

    20101
  • Thread
    +關(guān)注

    關(guān)注

    2

    文章

    88

    瀏覽量

    26428

原文標(biāo)題:ThreadLocal 搭配線程池使用造成內(nèi)存泄漏的原因和解決方案

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    全球唯一?IBM更新量子計(jì)算路線圖:2029年交付!

    電子發(fā)燒友網(wǎng)報(bào)道(文/梁浩斌)近年來(lái),量子計(jì)算似乎正在取得越來(lái)越多突破,國(guó)內(nèi)外都涌現(xiàn)出不少的技術(shù)以及產(chǎn)品突破。作為量子計(jì)算領(lǐng)域的先驅(qū)之一,IBM近日公布了其量子計(jì)算路線圖,宣布將在2029年交付全球首個(gè)大規(guī)模容錯(cuò)量子計(jì)算機(jī)——IBM Quantum Starling。 ? 同時(shí)IBM也推出了兩篇技術(shù)論文,詳細(xì)介紹他們是如何解決搭建大規(guī)模容錯(cuò)架構(gòu)的問(wèn)題。 ? IBM 量子計(jì)算路線圖 ? 其實(shí)從2020年開(kāi)始,IBM一直按著此前制定的路線圖穩(wěn)步推進(jìn)量子計(jì)算。最近公布的
    的頭像 發(fā)表于 06-15 00:01 ?4947次閱讀
    全球唯一?IBM更新量子計(jì)算路線圖:2029年交付!

    gpw無(wú)線充電模塊在哪

    本文為您梳理了GPW無(wú)線充電模塊的獲取渠道、技術(shù)原理及選購(gòu)要點(diǎn),旨在幫助您高效解決“電力焦慮”。主流電商平臺(tái)、專(zhuān)業(yè)廠商定制和黃金選購(gòu)法則,為您提供全方位解決方案。
    的頭像 發(fā)表于 06-15 08:46 ?36次閱讀
    gpw無(wú)線充電模塊在哪

    GD32F470系統(tǒng)復(fù)位函數(shù)是什么

    發(fā)表于 06-15 07:42

    “天才”!OpenAI o3 成全球 IQ 最高的 AI 大模型

    電子發(fā)燒友網(wǎng)報(bào)道(文 / 吳子鵬)根據(jù)門(mén)薩智商(IQ)測(cè)試中的表現(xiàn),OpenAI o3 在全球 “智商最高” 的人工智能模型 TOP 24 中位居榜首,在門(mén)薩測(cè)試中獲得了 135 的高分,躋身 “天才” 行列;Anthropic 的 Claude-4 Sonnet 和谷歌的 Gemini 2.0 Flash Thinking 緊隨其后,測(cè)試得分分別為 127 和 126。 ? 如圖所示,排名前十的人工智能模型均為純文本模型,新一代的 Gemini 2.5 Pro、OpenAI o4 mini、馬斯克旗下 xAI 的 Grok-3 Think 的得分高于人類(lèi)的平均智商范圍。另外,排名后五位的
    的頭像 發(fā)表于 06-15 01:56 ?3373次閱讀
    “天才”!OpenAI o3 成全球 IQ 最高的 AI 大模型

    全屋智能組網(wǎng),華為Wi-Fi7星閃路由器X1系列如何脫穎而出?

    電子發(fā)燒友網(wǎng)原創(chuàng) 章鷹 據(jù)國(guó)際調(diào)研機(jī)構(gòu)Omdia的最新報(bào)告,在2020年至2029年期間,全球移動(dòng)網(wǎng)與固定寬帶網(wǎng)絡(luò)連接數(shù)增長(zhǎng)強(qiáng)勁,每年都以18%的年增長(zhǎng)率穩(wěn)步攀升。與此同時(shí),與此同時(shí),全球互聯(lián)網(wǎng)消費(fèi)者和企業(yè)設(shè)備安裝的數(shù)量增幅也達(dá)到了75%。全球數(shù)字連接加速發(fā)展,數(shù)字經(jīng)濟(jì)成為驅(qū)動(dòng)全球經(jīng)濟(jì)變革的核心動(dòng)力。寬帶網(wǎng)絡(luò)作為關(guān)鍵的數(shù)字基礎(chǔ)設(shè)施,是推動(dòng)數(shù)字化的重要抓手。 中國(guó)電信集團(tuán)原總經(jīng)理、全球云網(wǎng)寬帶產(chǎn)業(yè)協(xié)會(huì)首屆董事會(huì)主席李正茂表示:“從
    的頭像 發(fā)表于 06-15 00:59 ?4646次閱讀

    4.6億投資!200MW/400MWh鋰鈉混儲(chǔ)站投運(yùn),年調(diào)5.8億度綠電

    電子發(fā)燒友網(wǎng)報(bào)道(文/黃山明)日前,我國(guó)首個(gè)大型鋰鈉混合儲(chǔ)能站——南方電網(wǎng)寶池儲(chǔ)能站在云南投產(chǎn)。值得一提的是,這座鋰鈉混合儲(chǔ)能電站,應(yīng)用了全球首套構(gòu)網(wǎng)型鈉離子儲(chǔ)能系統(tǒng)。 ? 該儲(chǔ)能站占地面積約50畝,投資超過(guò)4.6億元,裝機(jī)容量為200 兆瓦/400兆瓦時(shí)。按照每天兩充兩放測(cè)算,年調(diào)節(jié)電量5.8億千瓦時(shí),可滿(mǎn)足近27萬(wàn)戶(hù)居民一年的用電需求,其中98%為綠電。 ? 普通儲(chǔ)能通常為跟網(wǎng)型或并網(wǎng)型儲(chǔ)能,依賴(lài)電網(wǎng)的頻率和電壓信號(hào)進(jìn)行控制,作為
    的頭像 發(fā)表于 06-15 00:57 ?4762次閱讀

    AI走向應(yīng)用還得看智能體,阿里、美團(tuán)、滴滴相繼入局!

    電子發(fā)燒友網(wǎng)報(bào)道(文/李彎彎)AI智能體是指能夠感知環(huán)境并采取行動(dòng)以實(shí)現(xiàn)特定目標(biāo)的代理體。它可以是軟件、硬件或一個(gè)系統(tǒng),具備自主性、適應(yīng)性和交互能力。智能體通過(guò)感知環(huán)境中的變化(如通過(guò)傳感器或數(shù)據(jù)輸入),根據(jù)自身學(xué)習(xí)到的知識(shí)和算法進(jìn)行判斷和決策,進(jìn)而執(zhí)行動(dòng)作以影響環(huán)境或達(dá)到預(yù)定的目標(biāo)。 ? AI智能體與傳統(tǒng)AI的區(qū)別在于,傳統(tǒng)AI通常專(zhuān)注于單一任務(wù),如圖像識(shí)別、語(yǔ)音識(shí)別等。它們?cè)谔囟ǖ娜蝿?wù)上表現(xiàn)出色,但缺乏自主性和
    的頭像 發(fā)表于 06-15 00:00 ?4291次閱讀

    【RA4L1-SENSOR】結(jié)項(xiàng)

    本帖最后由 donatello1996 于 2025-6-14 22:51 編輯 原定項(xiàng)目?jī)?nèi)容: 1.基于板載段碼LCD顯示屏制作一個(gè)簡(jiǎn)易\"電壓檢測(cè)器\"(SLCDC和ADC);(因占用IO沖突的原因放棄,并且其他試用者已經(jīng)做了詳細(xì)評(píng)測(cè)) 2.低功耗功能(評(píng)估MCU的節(jié)能性能),使用INA219模塊檢測(cè)開(kāi)發(fā)板運(yùn)行時(shí)電流大小,就可以得出開(kāi)發(fā)板運(yùn)行功率;(INA219模塊通信失敗,放棄) 3.使用開(kāi)發(fā)板的SPI接口接入NRF24L01模塊,進(jìn)行2.4G無(wú)線通信;(成功) 4..使用開(kāi)發(fā)板的I2C接口接入BMP280模塊,檢測(cè)大氣壓數(shù)值;(成功) 新增已完成項(xiàng)目?jī)?nèi)容: 5.使用QSPI總線讀寫(xiě)QSPI FLASH; 6.使用模擬I2C總線 首先,在開(kāi)始任何開(kāi)發(fā)之前,需要下載最新版本的RASC安裝包,我這里下載的是FSP5.9的安裝包,使用新版本RASC安裝包以便支持RA4L1新系列的開(kāi)發(fā): 硬件框圖: 流程圖: 串口打印直接使用開(kāi)發(fā)板USB Type-C接口的USB轉(zhuǎn)TTL,也就是SCI9(P109和P110),使用KEIL自帶的microLIB選項(xiàng),程序引用stdio.h,覆寫(xiě)fputc函數(shù)原型即可直接支持printf串口打印(RTT kprintf后面有機(jī)會(huì)再進(jìn)行嘗試,串口用習(xí)慣了): #include #include \"hal_data.h\" int fputc(int ch, FILE *f) { (void)f; while(!g_uart9_ctrl.p_reg->SSR_b.TEND); g_uart9_ctrl.p_reg->TDR = (uint8_t)ch; return ch; } 顯示用的SPITFTLCD4.3寸液晶屏是一款帶CPLD主控和SDRAM的液晶屏,通過(guò)SPI接口進(jìn)行指令傳輸,刷屏和顯示字符的能力很強(qiáng),唯一不足的是刷圖效率低,可以通過(guò)GPIO模擬SPI方式直接驅(qū)動(dòng),占用三個(gè)引腳,分別為P500 P502 P504: #define SPILCD43_FAKE_SPI_CS_LOWR_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_00 , BSP_IO_LEVEL_LOW) #define SPILCD43_FAKE_SPI_CS_HIGHR_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_00 , BSP_IO_LEVEL_HIGH) #define SPILCD43_FAKE_SPI_CLK_LOWR_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_02 , BSP_IO_LEVEL_LOW) #define SPILCD43_FAKE_SPI_CLK_HIGHR_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_02 , BSP_IO_LEVEL_HIGH) #define SPILCD43_FAKE_SPI_DI_LOWR_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_04 , BSP_IO_LEVEL_LOW) #define SPILCD43_FAKE_SPI_DI_HIGHR_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_04 , BSP_IO_LEVEL_HIGH) void Fake_SPI_WriteByte(uint8_t data) { uint8_t i = 0 , temp = 0; for(i = 0 ; i < 8 ; i++) { temp = ((data&0x80)==0x80) ? 1:0; data = data << 1; SPILCD43_FAKE_SPI_CLK_LOW; if(temp) SPILCD43_FAKE_SPI_DI_HIGH; else SPILCD43_FAKE_SPI_DI_LOW; R_BSP_SoftwareDelay(2 , BSP_DELAY_UNITS_MICROSECONDS); SPILCD43_FAKE_SPI_CLK_HIGH; R_BSP_SoftwareDelay(2 , BSP_DELAY_UNITS_MICROSECONDS); } SPILCD43_FAKE_SPI_CLK_HIGH; } void LCD_send_command(uint8_t out_cmd) { SPILCD43_FAKE_SPI_CS_LOW; Fake_SPI_WriteByte(out_cmd); SPILCD43_FAKE_SPI_CS_HIGH; } void LCD_send_data(uint32_t out_data) { SPILCD43_FAKE_SPI_CS_LOW; Fake_SPI_WriteByte((out_data >> 8) & 0xff); Fake_SPI_WriteByte(out_data & 0xff); SPILCD43_FAKE_SPI_CS_HIGH; } void LCD_write_com(uint32_t addr , uint32_t num) { LCD_send_command(addr & 0xff); LCD_send_data(num); } void LCD_Set_Windows(unsigned int x0, unsigned int y0,unsigned int x1, unsigned int y1) { LCD_write_com(CMD_Xaddr_Start ,x0); LCD_write_com(CMD_Xaddr_End ,x1); LCD_write_com(CMD_Yaddr_Start ,y0); LCD_write_com(CMD_Yaddr_End ,y1); LCD_write_com(CMD_Xaddr, x0); LCD_write_com(CMD_Yaddr, y0); } void LCD_SET_FRONT(uint16_t color) { LCD_write_com(CMD_FRONT , color); LCD_send_command(CMD_Data); } void LCD_SET_BACK(uint16_t color) { LCD_write_com(CMD_BACK,color); LCD_send_command(CMD_Data); } void LCD_SET_Backlight(unsigned char BLK_num) { LCD_PWM = BLK_num; LCD_write_com(CMD_Ctrl , LCD_PWM); } void LCD_Set_ramaddr(unsigned int x,unsigned int y) { LCD_write_com(CMD_Yaddr,y); LCD_write_com(CMD_Xaddr,x); } void LCD_RectangleFill(unsigned int x0 , unsigned int y0 ,unsigned int x1 , unsigned int y1 , uint16_t color) { LCD_Set_Windows(x0,y0,x1,y1); LCD_SET_FRONT(color); LCD_write_com(CMD_Ctrl , CMD_Ctrl_Fill); //while(TFT_BUSY==0); R_BSP_SoftwareDelay(20 , BSP_DELAY_UNITS_MILLISECONDS); LCD_Set_Windows(0 , 0 , (LCD_XSIZE-1) , (LCD_YSIZE-1)); } void DispClear_LCD(uint16_t color) { LCD_RectangleFill(0 , 0 , (LCD_XSIZE-1) , (LCD_YSIZE-1) , color); } void LCD_DrawString(unsigned int x, unsigned int y, unsigned char *pStr, unsigned int LineColor,unsigned int FillColor, unsigned char CMD_CHAR_MOD) { LCD_SET_FRONT(LineColor); LCD_SET_BACK(FillColor); LCD_Set_ramaddr(x,y); while(*pStr>0) { if (*pStr > 0x80) { LCD_write_com(CMD_CHAR_MOD , ((*pStr)<<8)+(*(pStr+1))); pStr += 2; } else { LCD_write_com(CMD_CHAR_MOD , *pStr); pStr += 1; } } R_BSP_SoftwareDelay(20 , BSP_DELAY_UNITS_MILLISECONDS); } 然后是NRF24L01模塊,設(shè)置為接收模式,占用硬件SPI0接口,直接接到Arduino的那組SPI接口(P210 P211 P209)上即可,并需要額外占用SPI0接口下方的P204 P600 P602三個(gè)引腳分別用作片選 CE IRQ功能: #define NRF24L01_CS_HIGHR_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_04 , BSP_IO_LEVEL_HIGH) #define NRF24L01_CS_LOWR_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_04 , BSP_IO_LEVEL_LOW) //P204 D10 #define NRF24L01_CE_HIGHR_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_06_PIN_00 , BSP_IO_LEVEL_HIGH) #define NRF24L01_CE_LOWR_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_06_PIN_00 , BSP_IO_LEVEL_LOW) //P600 D9 //#define NRF24L01_IRQ_READ //P602 D8 #define NRF_READ_REG 0x00 #define NRF_WRITE_REG0x20 #define RD_RX_PLOAD0x61 #define WR_TX_PLOAD0xA0 #define FLUSH_TX0xE1 #define FLUSH_RX0xE2 #define REUSE_TX_PL0xE3 #define NOP 0xFF #define CONFIG 0x00 #define EN_AA0x01 #define EN_RXADDR 0x02 #define SETUP_AW0x03 #define SETUP_RETR0x04 #define RF_CH0x05 #define RF_SETUP 0x06 #define STATUS 0x07 #define MAX_TX0x10 #define TX_OK0x20 #define RX_OK0x40 #define OBSERVE_TX0x08 #define CD0x09 #define RX_ADDR_P00x0A #define RX_ADDR_P10x0B #define RX_ADDR_P20x0C #define RX_ADDR_P30x0D #define RX_ADDR_P40x0E #define RX_ADDR_P50x0F #define TX_ADDR0x10 #define RX_PW_P00x11 #define RX_PW_P10x12 #define RX_PW_P20x13 #define RX_PW_P30x14 #define RX_PW_P40x15 #define RX_PW_P50x16 #define NRF_FIFO_STATUS 0x17 #define TX_ADR_WIDTH 5 #define RX_ADR_WIDTH 5 #define TX_PLOAD_WIDTH32 #define RX_PLOAD_WIDTH32 const uint8_t TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; const uint8_t RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; uint8_t SPI0_P209_210_P211_Read_Write_Byte(uint8_t txdata) { uint8_t rxdata; R_SPI_WriteRead(&g_spi0_ctrl , &txdata , &rxdata , 1 , 4); return rxdata; } uint8_t NRF24L01_Write_Buf(uint8_t reg , uint8_t *pBuf , uint8_t len) { uint8_t status , u8_ctr; NRF24L01_CS_LOW; status = SPI0_P209_210_P211_Read_Write_Byte(reg); for(u8_ctr = 0 ; u8_ctr < len ; u8_ctr ++) SPI0_P209_210_P211_Read_Write_Byte(*pBuf++); NRF24L01_CS_HIGH; return status; } uint8_t NRF24L01_Read_Buf(uint8_t reg , uint8_t *pBuf , uint8_t len) { uint8_t status , u8_ctr; NRF24L01_CS_LOW; status = SPI0_P209_210_P211_Read_Write_Byte(reg); for(u8_ctr = 0 ; u8_ctr < len ; u8_ctr ++) pBuf[u8_ctr] = SPI0_P209_210_P211_Read_Write_Byte(0xff); NRF24L01_CS_HIGH; return status; } uint8_t NRF24L01_Write_Reg(uint8_t reg , uint8_t value) { uint8_t status; NRF24L01_CS_LOW; status = SPI0_P209_210_P211_Read_Write_Byte(reg); SPI0_P209_210_P211_Read_Write_Byte(value); NRF24L01_CS_HIGH; return(status); } uint8_t NRF24L01_Read_Reg(uint8_t reg) { uint8_t reg_val; NRF24L01_CS_LOW; SPI0_P209_210_P211_Read_Write_Byte(reg); reg_val = SPI0_P209_210_P211_Read_Write_Byte(0XFF); NRF24L01_CS_HIGH; return(reg_val); } uint8_t NRF24L01_Check(void) { uint8_t buf[5]={0xa5 , 0xa5 , 0xa5 , 0xa5 , 0xa5}; uint8_t i; NRF24L01_Write_Buf(NRF_WRITE_REG + TX_ADDR , buf , 5); NRF24L01_Read_Buf(TX_ADDR , buf , 5); for(i=0;i<5;i++) if(buf!=0XA5) break; if(i!=5) return 1; return 0; } uint8_t NRF24L01_RxPacket(uint8_t *rxbuf) { uint8_t sta; sta = NRF24L01_Read_Reg(STATUS); NRF24L01_Write_Reg(NRF_WRITE_REG + STATUS , sta); if(sta & RX_OK) { printf(\"sta = 0x%x RX_OK.\\n\" , sta); NRF24L01_Read_Buf(RD_RX_PLOAD , rxbuf , RX_PLOAD_WIDTH); NRF24L01_Write_Reg(FLUSH_RX , 0xff); return 0; } return 1; } void NRF24L01_RX_Mode(void) { NRF24L01_CE_LOW; NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(uint8_t*)RX_ADDRESS,RX_ADR_WIDTH); NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40); NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH); NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f); NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f); NRF24L01_CE_HIGH; } BMP280模塊則是使用P402 P403 GPIO模擬I2C進(jìn)行通信,注意P403需設(shè)置為開(kāi)漏輸出模式: #define I2C_SCL_P402_HIGHR_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_02 , BSP_IO_LEVEL_HIGH) #define I2C_SCL_P402_LOWR_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_02 , BSP_IO_LEVEL_LOW) #define I2C_SDA_P403_HIGHR_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_03 , BSP_IO_LEVEL_HIGH) #define I2C_SDA_P403_LOWR_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_03 , BSP_IO_LEVEL_LOW) void I2C_IDLE_P402_P403() { I2C_SDA_P403_OUT(); I2C_SDA_P403_HIGH; I2C_SCL_P402_HIGH; R_BSP_SoftwareDelay(4 , BSP_DELAY_UNITS_MICROSECONDS); } void I2C_Start_P402_P403(void) { I2C_SDA_P403_OUT(); I2C_SDA_P403_HIGH; I2C_SCL_P402_HIGH; R_BSP_SoftwareDelay(4 , BSP_DELAY_UNITS_MICROSECONDS); I2C_SDA_P403_LOW; R_BSP_SoftwareDelay(4 , BSP_DELAY_UNITS_MICROSECONDS); I2C_SCL_P402_LOW; R_BSP_SoftwareDelay(4 , BSP_DELAY_UNITS_MICROSECONDS); } void I2C_Stop_P402_P403(void) { I2C_SDA_P403_OUT(); I2C_SDA_P403_LOW; I2C_SCL_P402_HIGH; R_BSP_SoftwareDelay(4 , BSP_DELAY_UNITS_MICROSECONDS); I2C_SDA_P403_HIGH; } uint8_t I2C_Wait_Ack_P402_P403(void) { uint8_t rvalue; I2C_SDA_P403_OUT(); I2C_SDA_P403_HIGH; R_BSP_SoftwareDelay(4 , BSP_DELAY_UNITS_MICROSECONDS); I2C_SCL_P402_HIGH; R_BSP_SoftwareDelay(4 , BSP_DELAY_UNITS_MICROSECONDS); I2C_SDA_P403_IN(); if(I2C_SDA_P403_READ()) { rvalue = 1; } else { rvalue = 0; } I2C_SCL_P402_LOW; R_BSP_SoftwareDelay(4 , BSP_DELAY_UNITS_MICROSECONDS); return rvalue; } void I2C_Ack_P402_P403(void) { I2C_SDA_P403_OUT(); I2C_SDA_P403_LOW; R_BSP_SoftwareDelay(4 , BSP_DELAY_UNITS_MICROSECONDS); I2C_SCL_P402_HIGH; R_BSP_SoftwareDelay(4 , BSP_DELAY_UNITS_MICROSECONDS); I2C_SCL_P402_LOW; R_BSP_SoftwareDelay(4 , BSP_DELAY_UNITS_MICROSECONDS); I2C_SDA_P403_HIGH; } void I2C_NAck_P402_P403(void) { I2C_SDA_P403_OUT(); I2C_SDA_P403_HIGH; R_BSP_SoftwareDelay(4 , BSP_DELAY_UNITS_MICROSECONDS); I2C_SCL_P402_HIGH; R_BSP_SoftwareDelay(4 , BSP_DELAY_UNITS_MICROSECONDS); I2C_SCL_P402_LOW; R_BSP_SoftwareDelay(4 , BSP_DELAY_UNITS_MICROSECONDS); } void I2C_Send_Byte_P402_P403(uint8_t txd) { uint8_t i; I2C_SDA_P403_OUT(); I2C_SCL_P402_LOW; for(i = 0 ; i < 8 ; i ++) { if((txd&0x80)>>7) I2C_SDA_P403_HIGH; else I2C_SDA_P403_LOW; txd <<= 1; R_BSP_SoftwareDelay(20 , BSP_DELAY_UNITS_MICROSECONDS); I2C_SCL_P402_HIGH; R_BSP_SoftwareDelay(20 , BSP_DELAY_UNITS_MICROSECONDS); I2C_SCL_P402_LOW; R_BSP_SoftwareDelay(20 , BSP_DELAY_UNITS_MICROSECONDS); } R_BSP_SoftwareDelay(20 , BSP_DELAY_UNITS_MICROSECONDS); } uint16_t I2C_Read_Byte_P402_P403(uint8_t ack) { uint8_t i; uint16_t dat = 0; I2C_SDA_P403_IN(); for(i = 0 ; i < 8 ; i++) { I2C_SCL_P402_LOW; R_BSP_SoftwareDelay(20 , BSP_DELAY_UNITS_MICROSECONDS); I2C_SCL_P402_HIGH; dat <<= 1; if(I2C_SDA_P403_READ()) dat++; R_BSP_SoftwareDelay(20 , BSP_DELAY_UNITS_MICROSECONDS); } if (!ack) I2C_NAck_P402_P403(); else I2C_Ack_P402_P403(); return dat; } uint8_t I2C_Read_Addr_P402_P403(uint8_t dev_addr , uint8_t reg) { uint8_t res; I2C_Start_P402_P403(); I2C_Send_Byte_P402_P403((dev_addr << 1) | 0); I2C_Wait_Ack_P402_P403(); I2C_Send_Byte_P402_P403(reg); I2C_Wait_Ack_P402_P403(); I2C_Start_P402_P403(); I2C_Send_Byte_P402_P403((dev_addr << 1) | 1); I2C_Wait_Ack_P402_P403(); res = I2C_Read_Byte_P402_P403(0); I2C_Stop_P402_P403(); return res; } void I2C_Read_Datas_P100_P101(uint8_t dev_addr , uint8_t reg , uint8_t data_len , uint8_t data[]) { while(data_len) { *data = I2C_Read_Addr_P402_P403(dev_addr , reg++); data ++; data_len --; } } void I2C_Write_Reg_Data_P402_P403(uint8_t dev_addr , uint8_t reg , uint8_t data) { I2C_Start_P402_P403(); I2C_Send_Byte_P402_P403((dev_addr << 1) | 0); I2C_Wait_Ack_P402_P403(); I2C_Send_Byte_P402_P403(reg); I2C_Wait_Ack_P402_P403(); I2C_Send_Byte_P402_P403(data); I2C_Wait_Ack_P402_P403(); I2C_Stop_P402_P403(); } void I2C_Write_Reg_Datas_P402_P403(uint8_t dev_addr , uint8_t reg , uint8_t data_len , uint8_t data[]) { int i; I2C_Start_P402_P403(); I2C_Send_Byte_P402_P403((dev_addr << 1) | 0); I2C_Wait_Ack_P402_P403(); I2C_Send_Byte_P402_P403(reg); I2C_Wait_Ack_P402_P403(); for(i = 0 ; i < data_len ; i++) { I2C_Send_Byte_P402_P403(data); I2C_Wait_Ack_P402_P403(); } I2C_Stop_P402_P403(); R_BSP_SoftwareDelay(10 , BSP_DELAY_UNITS_MILLISECONDS); } #define ATH20_SLAVE_ADDRESS0x38 #define BMP280_PRESSURE_OSR (BMP280_OVERSAMP_8X) #define BMP280_TEMPERATURE_OSR (BMP280_OVERSAMP_16X) #define BMP280_MODE (BMP280_PRESSURE_OSR << 2 | BMP280_TEMPERATURE_OSR << 5 | BMP280_NORMAL_MODE) #define BMP280_SLAVE_ADDRESS_0x760x76 #define BMP280_SLAVE_ADDRESS_0x77 0x77 /*calibration parameters */ #define BMP280_DIG_T1_LSB_REG 0x88 #define BMP280_DIG_T1_MSB_REG 0x89 #define BMP280_DIG_T2_LSB_REG 0x8A #define BMP280_DIG_T2_MSB_REG 0x8B #define BMP280_DIG_T3_LSB_REG 0x8C #define BMP280_DIG_T3_MSB_REG 0x8D #define BMP280_DIG_P1_LSB_REG 0x8E #define BMP280_DIG_P1_MSB_REG 0x8F #define BMP280_DIG_P2_LSB_REG 0x90 #define BMP280_DIG_P2_MSB_REG 0x91 #define BMP280_DIG_P3_LSB_REG 0x92 #define BMP280_DIG_P3_MSB_REG 0x93 #define BMP280_DIG_P4_LSB_REG 0x94 #define BMP280_DIG_P4_MSB_REG 0x95 #define BMP280_DIG_P5_LSB_REG 0x96 #define BMP280_DIG_P5_MSB_REG 0x97 #define BMP280_DIG_P6_LSB_REG 0x98 #define BMP280_DIG_P6_MSB_REG 0x99 #define BMP280_DIG_P7_LSB_REG 0x9A #define BMP280_DIG_P7_MSB_REG 0x9B #define BMP280_DIG_P8_LSB_REG 0x9C #define BMP280_DIG_P8_MSB_REG 0x9D #define BMP280_DIG_P9_LSB_REG 0x9E #define BMP280_DIG_P9_MSB_REG 0x9F #define BMP280_CHIPID_REG0xD0/*Chip ID Register */ #define BMP280_RESET_REG0xE0/*Softreset Register */ #define BMP280_STATUS_REG0xF3/*Status Register */ #define BMP280_CTRLMEAS_REG0xF4/*Ctrl Measure Register */ #define BMP280_CONFIG_REG0xF5/*Configuration Register */ #define BMP280_PRESSURE_MSB_REG0xF7/*Pressure MSB Register */ #define BMP280_PRESSURE_LSB_REG0xF8/*Pressure LSB Register */ #define BMP280_PRESSURE_XLSB_REG 0xF9/*Pressure XLSB Register */ #define BMP280_TEMPERATURE_MSB_REG0xFA/*Temperature MSB Reg */ #define BMP280_TEMPERATURE_LSB_REG0xFB/*Temperature LSB Reg */ #define BMP280_TEMPERATURE_XLSB_REG 0xFC/*Temperature XLSB Reg */ #define BMP280_SLEEP_MODE(0x00) #define BMP280_FORCED_MODE(0x01) #define BMP280_NORMAL_MODE(0x03) #define BMP280_TEMPERATURE_CALIB_DIG_T1_LSB_REG (0x88) #define BMP280_PRESSURE_TEMPERATURE_CALIB_DATA_LENGTH (24) #define BMP280_DATA_FRAME_SIZE(6) #define BMP280_OVERSAMP_SKIPPED(0x00) #define BMP280_OVERSAMP_1X(0x01) #define BMP280_OVERSAMP_2X(0x02) #define BMP280_OVERSAMP_4X(0x03) #define BMP280_OVERSAMP_8X(0x04) #define BMP280_OVERSAMP_16X(0x05)這里還需要注意的是,BMP280模塊有兩個(gè)硬件地址,0x76和0x77,每個(gè)第三方廠商的硬件跳線設(shè)置是不同的,我這里這個(gè)模塊是0x77。 最后是QSPI驅(qū)動(dòng)代碼,直接移植RA6E2的代碼拿來(lái)用: uint32_t FlashDeviceID = 0; uint32_t FlashID = 0; #define WriteEnable0x06 #define WriteDisable 0x04 #define ReadStatusReg0x05 #define WriteStatusReg0x01 #define ReadData0x03 #define FastReadData 0x0B #define FastReadDual 0x3B #define PageProgram0x02 #define BlockErase0xD8 #define SectorErase0x20 #define ChipErase 0xC7 #define PowerDown 0xB9 #define ReleasePowerDown0xAB #define DeviceID0xAB #define ManufactDeviceID0x90 #define JedecDeviceID0x9F uint8_t buffer_write[] = \"bbs.elecfans.com RA4L1 donatello1996\"; uint8_t buffer_read[sizeof(buffer_write)]; float double_buffer_write[7] = {1.2 , 3.4 , 5.5 , 7.9 , 9.8 , 9.9 , 10.0}; float double_buffer_read[sizeof(double_buffer_write)] = {0}; #defineFLASH_WriteAddress10x00000 #defineFLASH_WriteAddress20x00100 #define SPI_FLASH_PageSize256 #define SPI_FLASH_PerWritePageSize256 #define RESET_VALUE(0x00) uint32_t QSPI_Flash_ReadID(void) { unsigned char data[6] = {}; uint32_t back; data[0] = JedecDeviceID; R_QSPI_DirectWrite(&g_qspi0_ctrl, &data[0], 1, true); R_QSPI_DirectRead(&g_qspi0_ctrl, &data[0], 3); back = (data[0] << 16) | (data[1] << 8) | (data[2]); return back; } uint32_t QSPI_Flash_ReadDeviceID(void) { unsigned char data[6] = {}; uint32_t back; data[0] = DeviceID; data[1] = 0xff; data[2] = 0xff; data[3] = 0xff; R_QSPI_DirectWrite(&g_qspi0_ctrl, &data[0], 4, true); R_QSPI_DirectRead(&g_qspi0_ctrl, &data[0], 3); back = (data[0] << 16) | (data[1] << 8) | (data[2]); return back; } fsp_err_t QSPI_Flash_WaitForWriteEnd(void) { spi_flash_status_t status = {.write_in_progress = true}; int32_t time_out = (INT32_MAX); fsp_err_t err = FSP_SUCCESS; do { err = R_QSPI_StatusGet(&g_qspi0_ctrl, &status); if (FSP_SUCCESS != err) { printf(\"R_QSPI_StatusGet Failed\\r\\n\"); return err; } --time_out; if (RESET_VALUE >= time_out) { printf(\"\\r\\n ** Timeout : No result from QSPI flash status register ** \\r\\n\"); return FSP_ERR_TIMEOUT; } } while (false != status.write_in_progress); return err; } void QSPI_Flash_SectorErase(uint32_t adress) { unsigned char data[6] = {}; data[0] = 0x06;//write_enable_command data[1] = 0x20;//erase_command data[2] = (uint8_t)(adress >> 16); data[3] = (uint8_t)(adress >> 8); data[4] = (uint8_t)(adress); R_QSPI->SFMCMD = 1U; R_QSPI->SFMCOM = data[0]; R_QSPI_DirectWrite(&g_qspi0_ctrl, &data[1], 4, false); QSPI_Flash_WaitForWriteEnd(); } void QSPI_Flash_BufferWrite(uint8_t *pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) { uint8_t NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0, temp = 0; Addr = WriteAddr % SPI_FLASH_PageSize; count = SPI_FLASH_PageSize - Addr; NumOfPage =NumByteToWrite / SPI_FLASH_PageSize; NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize; if (Addr == 0) { if (NumOfPage == 0) { R_QSPI_Write(&g_qspi0_ctrl, pBuffer, (uint8_t*)WriteAddr , NumByteToWrite); QSPI_Flash_WaitForWriteEnd(); } else { while (NumOfPage--) { R_QSPI_Write(&g_qspi0_ctrl, pBuffer, (uint8_t*)WriteAddr , SPI_FLASH_PageSize); QSPI_Flash_WaitForWriteEnd(); WriteAddr +=SPI_FLASH_PageSize; pBuffer += SPI_FLASH_PageSize; } R_QSPI_Write(&g_qspi0_ctrl, pBuffer, (uint8_t*)WriteAddr , NumOfSingle); QSPI_Flash_WaitForWriteEnd(); } } else { if (NumOfPage == 0) { if (NumOfSingle > count) { temp = NumOfSingle - count; R_QSPI_Write(&g_qspi0_ctrl, pBuffer, (uint8_t*)WriteAddr , count); QSPI_Flash_WaitForWriteEnd(); WriteAddr +=count; pBuffer += count; R_QSPI_Write(&g_qspi0_ctrl, pBuffer, (uint8_t*)WriteAddr , temp); QSPI_Flash_WaitForWriteEnd(); } else { R_QSPI_Write(&g_qspi0_ctrl, pBuffer, (uint8_t*)WriteAddr , NumByteToWrite); QSPI_Flash_WaitForWriteEnd(); } } else { NumByteToWrite -= count; NumOfPage =NumByteToWrite / SPI_FLASH_PageSize; NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize; R_QSPI_Write(&g_qspi0_ctrl, pBuffer, (uint8_t*)WriteAddr , count); QSPI_Flash_WaitForWriteEnd(); WriteAddr +=count; pBuffer += count; while (NumOfPage--) { R_QSPI_Write(&g_qspi0_ctrl, pBuffer, (uint8_t*)WriteAddr , SPI_FLASH_PageSize); QSPI_Flash_WaitForWriteEnd(); WriteAddr +=SPI_FLASH_PageSize; pBuffer += SPI_FLASH_PageSize; } if (NumOfSingle != 0) { R_QSPI_Write(&g_qspi0_ctrl, pBuffer, (uint8_t*)WriteAddr , NumOfSingle); QSPI_Flash_WaitForWriteEnd(); } } } } static void qspi_d0_byte_write_standard(uint8_t byte) { R_QSPI->SFMCOM = byte; } fsp_err_t R_QSPI_Read(spi_flash_ctrl_t*p_ctrl, uint8_t*p_src, uint8_t *const p_dest, uint32_tbyte_count) { qspi_instance_ctrl_t *p_instance_ctrl = (qspi_instance_ctrl_t *) p_ctrl; uint32_t chip_address = (uint32_t) p_dest - (uint32_t) QSPI_DEVICE_START_ADDRESS + R_QSPI->SFMCNT1; bool restore_spi_mode = false; void (* write_command)(uint8_t byte) = qspi_d0_byte_write_standard; void (* write_address)(uint8_t byte) = qspi_d0_byte_write_standard; #if QSPI_CFG_SUPPORT_EXTENDED_SPI_MULTI_LINE_PROGRAM /* If the peripheral is in extended SPI mode, and the configuration provided in the BSP allows for programming on * multiple data lines, and a unique command is provided for the required mode, update the SPI protocol to send * data on multiple lines. */ if ((SPI_FLASH_DATA_LINES_1 != p_instance_ctrl->data_lines) && (SPI_FLASH_PROTOCOL_EXTENDED_SPI == R_QSPI->SFMSPC_b.SFMSPI)) { R_QSPI->SFMSPC_b.SFMSPI = p_instance_ctrl->data_lines; restore_spi_mode = true; /* Write command in extended SPI mode on one line. */ write_command = gp_qspi_prv_byte_write[p_instance_ctrl->data_lines]; if (SPI_FLASH_DATA_LINES_1 == p_instance_ctrl->p_cfg->page_program_address_lines) { /* Write address in extended SPI mode on one line. */ write_address = gp_qspi_prv_byte_write[p_instance_ctrl->data_lines]; } } #endif /* Enter Direct Communication mode */ R_QSPI->SFMCMD = 1; /* Send command to enable writing */ write_command(0x03); /* Write the address. */ if ((p_instance_ctrl->p_cfg->address_bytes & R_QSPI_SFMSAC_SFMAS_Msk) == SPI_FLASH_ADDRESS_BYTES_4) { /* Send the most significant byte of the address */ write_address((uint8_t)(chip_address >> 24)); } /* Send the remaining bytes of the address */ write_address((uint8_t)(chip_address >> 16)); write_address((uint8_t)(chip_address >> 8)); write_address((uint8_t)(chip_address)); /* Write the data. */ uint32_t index = 0; while (index < byte_count) { /* Read the device memory into the passed in buffer */ *(p_src + index) = (uint8_t) R_QSPI->SFMCOM; index++; } /* Close the SPI bus cycle. Reference section 39.10.3 \"Generating the SPI Bus Cycle during Direct Communication\" * in the RA6M3 manual R01UH0886EJ0100. */ R_QSPI->SFMCMD = 1; /* Return to ROM access mode */ R_QSPI->SFMCMD = 0; return FSP_SUCCESS; } void QSPI_Flash_BufferRead(uint8_t *pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead) { R_QSPI_Read(&g_qspi0_ctrl, pBuffer, (uint8_t*)ReadAddr, NumByteToRead); } 但是這里QSPI FLASH讀寫(xiě)有個(gè)問(wèn)題,這個(gè)問(wèn)題在RA8D1上面也復(fù)現(xiàn)了,那就是,能正常獲取器件ID,擦除扇區(qū),但是寫(xiě)入的數(shù)據(jù)會(huì)在掉電時(shí)丟失,三份完全相同的代碼,這個(gè)問(wèn)題在RA6E2上面不會(huì)出現(xiàn),原因不明。 當(dāng)上電后只讀:
    發(fā)表于 06-14 22:51

    求助,6832S做UART通信失敗

    如圖1,我使用到RXD2S和TXD2S兩個(gè)引腳通信。 如圖2,這是初始化,我覺(jué)得問(wèn)題就出在初始化這里,第一行語(yǔ)句是把P3.6、P3.7 復(fù)用為 RXD2、TXD2 并使能 UART,但是我把這一行去掉之后,直接卡死到初始化,連主循環(huán)都進(jìn)不去,無(wú)奈只能加上。有沒(méi)有大佬看出哪里出問(wèn)題了?上次我用其他芯片做uart,很久做不出來(lái),最后往初始化最上面加一個(gè)EX0=0就行了。但是這次也沒(méi)用。
    發(fā)表于 06-14 19:03

    中國(guó)傳感器市場(chǎng)規(guī)模突破4000億!工信部產(chǎn)業(yè)研究院最新數(shù)據(jù)出爐

    ? ? 近期,工信部直屬產(chǎn)業(yè)研究機(jī)構(gòu)賽迪研究院,發(fā)布最新的中國(guó)傳感器產(chǎn)業(yè)市場(chǎng)數(shù)據(jù),較具有參考性。本文僅做相關(guān)核心數(shù)據(jù)分享,報(bào)告原文請(qǐng)于賽迪顧問(wèn)官網(wǎng)獲取。 ? 據(jù)賽迪顧問(wèn)報(bào)告顯示,2024年中國(guó)傳感器市場(chǎng)規(guī)模首次超過(guò)4000億元——達(dá)4061.2億元,同比增長(zhǎng)11.4%。賽迪顧問(wèn)預(yù)計(jì),到2027年,中國(guó)傳感器市場(chǎng)規(guī)模有望達(dá)到5793.4億元。 ? 具體到各傳感器細(xì)分領(lǐng)域,在2024年中國(guó)傳感器市場(chǎng)細(xì)分份額中,壓力傳感器以714.2億元的規(guī)模排名第一,占比17.6%;流
    的頭像 發(fā)表于 06-14 17:37 ?79次閱讀
    中國(guó)傳感器市場(chǎng)規(guī)模突破4000億!工信部產(chǎn)業(yè)研究院最新數(shù)據(jù)出爐

    奧托立夫亮相2025軒轅汽車(chē)藍(lán)皮書(shū)論壇

    2025年6月13日—15日,備受矚目的2025第十七屆軒轅汽車(chē)藍(lán)皮書(shū)論壇(China Auto Blue-Book Forum,簡(jiǎn)稱(chēng)CABF)在廣州白云國(guó)際會(huì)議中心越秀萬(wàn)豪酒店·會(huì)議中心隆重召開(kāi),作為汽車(chē)行業(yè)的領(lǐng)軍企業(yè),奧托立夫中國(guó)區(qū)銷(xiāo)售、工程、戰(zhàn)略及業(yè)務(wù)發(fā)展副總裁毛莉莉受邀出席了此次盛會(huì)并參與圓桌論壇,與逾百名行業(yè)精英共繪行業(yè)未來(lái)新圖景。
    的頭像 發(fā)表于 06-14 17:36 ?315次閱讀

    PCBA代工代料行業(yè)怎么應(yīng)用AI技術(shù)?這五大變革不可不知

    ——從“制造”到“智造”,AI如何賦能電子制造的“心臟”? 在電子制造領(lǐng)域,PCBA(印刷電路板組裝)被稱(chēng)為電子產(chǎn)品的“心臟”,而代工代料模式則是這一行業(yè)高效運(yùn)轉(zhuǎn)的核心。隨著AI技術(shù)的快速滲透,傳統(tǒng)PCBA行業(yè)正經(jīng)歷一場(chǎng)從“經(jīng)驗(yàn)驅(qū)動(dòng)”到“數(shù)據(jù)驅(qū)動(dòng)”的智能化革命。本文將深入探討AI技術(shù)如何推動(dòng)這一領(lǐng)域的五大核心變革。 ? 一、生產(chǎn)流程智能化:效率與精度的雙重飛躍 AI質(zhì)檢:告別“人眼找芝麻”的時(shí)代 傳統(tǒng)PCBA檢測(cè)依賴(lài)人工目檢,效率低
    的頭像 發(fā)表于 06-14 17:35 ?73次閱讀
    PCBA代工代料行業(yè)怎么應(yīng)用AI技術(shù)?這五大變革不可不知

    programmer下載常見(jiàn)問(wèn)題總結(jié)-v11

    一、通過(guò)命令行燒寫(xiě) 參考文檔Efinity Programmer User Guide部分,內(nèi)容如下: 具體操作如下: Efinity版本?:2024.2 安裝路徑:?C:Efinity2024.2 Hex文件路徑:?E:FPGA_Demo1_Ti181j484pgm_test (1)打開(kāi)cmd (2)把路徑轉(zhuǎn)到C:Efinity2024.2bin,并運(yùn)行setup.bat (3)把路徑轉(zhuǎn)換到hex存儲(chǔ)的目錄 (4)先配置jtag_bridge文件,指令如下【注意fitd_program.py在.pgabinefx_pgm路徑下】: C:efinity2024.2binpython3 C:efinity2024.2pgmbinefx_pgmftdi_program.py -m jtag C:Efinity2024.2pgmflititaniumu00690A79.bit 其中bridge文件的路徑在programm
    的頭像 發(fā)表于 06-14 17:34 ?165次閱讀
    programmer下載常見(jiàn)問(wèn)題總結(jié)-v11

    如何防止電機(jī)驅(qū)動(dòng)系統(tǒng)中的電源故障

    電機(jī)驅(qū)動(dòng)系統(tǒng)作為工業(yè)自動(dòng)化、電動(dòng)汽車(chē)、家用電器等領(lǐng)域的核心部件,其電源穩(wěn)定性直接關(guān)系到設(shè)備的安全運(yùn)行和壽命。電源故障可能導(dǎo)致電機(jī)失控、設(shè)備損壞甚至安全事故。因此,如何有效預(yù)防和應(yīng)對(duì)電機(jī)驅(qū)動(dòng)系統(tǒng)中的電源故障,成為工程師和用戶(hù)關(guān)注的焦點(diǎn)。以下是針對(duì)電源故障的成因分析及系統(tǒng)性解決方案。 一、電源故障的主要類(lèi)型及成因 1. 電壓波動(dòng)與突降 ● 成因:電網(wǎng)負(fù)載突變(如大功率設(shè)備啟停)、線路阻抗過(guò)高或供電容量不足。 ● 影
    的頭像 發(fā)表于 06-14 17:33 ?71次閱讀
    如何防止電機(jī)驅(qū)動(dòng)系統(tǒng)中的電源故障

    Kuikly鴻蒙版正式開(kāi)源 —— 揭秘卓越性能適配之旅

    進(jìn)行評(píng)測(cè)對(duì)比,發(fā)現(xiàn)鴻蒙上的耗時(shí)是同等性能的iOS設(shè)備上2.48倍。為此,我們針對(duì)鴻蒙平臺(tái)進(jìn)行一系列的優(yōu)化,包括內(nèi)聯(lián)優(yōu)化、ThreadLocal優(yōu)化、協(xié)程性能優(yōu)化等。優(yōu)化后,鴻蒙Kotlin
    發(fā)表于 06-04 16:46
    主站蜘蛛池模板: 亚洲成综合人影院在院播放 | 涩久久 | 日韩精品一级毛片 | 日本最猛黑人xxxx猛交 | 国产高清在线看 | 在线免费视频网站 | 久久99热久久精品99 | 免费观看一级成人毛片 | 草色在线 | 午夜视频在线观看国产 | bt天堂资源| 天堂8在线天堂资源在线 | 青楼社区51在线视频视频 | 欧美系列在线 | 中文天堂在线最新2022更新 | 国产色拍| 在线观看黄色的网站 | 亚洲成a人片在线观看导航 亚洲成a人片在线观看尤物 | 久久精品免看国产 | 久久lu| 二级特黄绝大片免费视频大片 | 日韩免费毛片全部不收费 | 国产片一级 | 三级在线观看网站 | 久久男人网 | 狠狠色噜噜狠狠狠狠888奇米 | 亚洲欧美一区二区三区四区 | 四虎永久在线精品2022 | 4438x全国最大色 | 亚洲国产一区二区三区在线观看 | sss欧美一区二区三区 | 久草香蕉在线 | 夜夜网站 | 激情综合丝袜美女一区二区 | 欧美性淫爽www视频播放 | 天天躁狠狠躁夜夜躁2021 | 激情综合五月 | 永久免费观看黄网站 | 久热精品视频 | 人人做天天爱夜夜爽中字 | 性欧美高清视频 |