99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

如何在ZC706中實現(xiàn)千兆網(wǎng)配置?

FPGA之家 ? 來源:FPGA探索者 ? 作者:FPGA探索者 ? 2021-04-02 16:49 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

(1)使用ZC706開發(fā)板測試PS端網(wǎng)口(Echo,lwIP協(xié)議棧);

(2)配合操作PL端LED(直接驅(qū)動和使用消息隊列兩種方式);

(3)PS端串口UART打印調(diào)試信息;

(4)QSPI固化(Dual Quad SPI Parallel 8 bit模式)。

ZC706中,MAC 控制器與 PHY 通過 RGMII(Reduced Gigabit Media Independent Interface)接口進(jìn)行連接,實現(xiàn)千兆網(wǎng)。

一、工程概述

1. 開發(fā)板配置

使用Xilinx ZYNQ開發(fā)板ZC706,默認(rèn)配置ARM后即可使用PS端網(wǎng)口、串口和QSPI,放置AXI GPIO的IP核驅(qū)動PL端的4個LED。

1af00e94-92eb-11eb-8b86-12bb97331649.png

ARM端配置如下圖所示,以5處的ARM-A9為核心,使用1處的UART1打印調(diào)試信息,使用2處的網(wǎng)口0進(jìn)行以太網(wǎng)通信,使用3處的AXI GP(General Port)Master通用主設(shè)備接口連接PL端的AXI GPIO,最后使用4處的QSPI固化程序,燒錄Boot文件。

1b1d898c-92eb-11eb-8b86-12bb97331649.png

2. SDK程序

上述工程綜合、布局布線并生成bit流后,導(dǎo)出硬件。

新建應(yīng)用工程Application Project,選擇 OS Platform 平臺為 freertos10_xilinx(Vivado及SDK版本2018.2,低版本的可能是freertos9_xilinx),選擇Next,選中“FreeRTOS lwIP Echo Server”。

1b2e45b0-92eb-11eb-8b86-12bb97331649.png

1b7f340c-92eb-11eb-8b86-12bb97331649.png

新建完成后,即可進(jìn)行最基礎(chǔ)的網(wǎng)絡(luò)通信了。這里注意,默認(rèn)設(shè)置的是DCHP動態(tài)主機(jī)配置協(xié)議,需要開發(fā)板和電腦都連接到一個路由器上。如果直接使用網(wǎng)線連接開發(fā)板和電腦,則啟用 IPv4 協(xié)議,默認(rèn)配置的IP地址為192.168.1.10,子網(wǎng)掩碼255.255.255.0,網(wǎng)關(guān)196.128.1.1,如果想要更改默認(rèn)配置,可以在main.c文件的main_thread()主線程中修改,如下所示:

xil_printf(“ERROR: DHCP request timed out

”); xil_printf(“Configuring default IP of 192.168.1.10

”); IP4_ADDR(&(server_netif.ip_addr), 192, 168, 1, 10); IP4_ADDR(&(server_netif.netmask), 255, 255, 255, 0); IP4_ADDR(&(server_netif.gw), 192, 168, 1, 1);

LWIP 是一個小型開源的 TCP/IP 協(xié)議棧,支持IPv4、IPv6、TCP、UDP、DHCP等。

?IGMP 協(xié)議,用于網(wǎng)絡(luò)組管理,可以實現(xiàn)多播數(shù)據(jù)的接收

?Internet 協(xié)議(IP),包括 IPv4 和 IPv6,支持 IP 分片與重裝,包括通過多個網(wǎng)絡(luò)接口的數(shù)據(jù)包轉(zhuǎn)發(fā)

?用于網(wǎng)絡(luò)維護(hù)和調(diào)試的 Internet 控制消息協(xié)議(ICMP)

?用戶數(shù)據(jù)報協(xié)議(UDP)

?傳輸控制協(xié)議(TCP)擁塞控制,往返時間(RTT)估計,快速恢復(fù)和重傳

?DNS,域名解析

?SNMP,簡單網(wǎng)絡(luò)管理協(xié)議

?動態(tài)主機(jī)配置協(xié)議(DHCP)

?以太網(wǎng)地址解析協(xié)議(ARP)

?AUTOIP,IP 地址自動配置

?PPP,點(diǎn)對點(diǎn)協(xié)議,支持

3. 網(wǎng)絡(luò)設(shè)置

使用網(wǎng)線直接連接ZC706開發(fā)板和計算機(jī)網(wǎng)口,配置計算機(jī)IP地址為192.168.1.11,子網(wǎng)掩碼255.255.255.0,網(wǎng)關(guān)192.168.1.1,其中IP地址的最后一處可以更改為其他值,但是不能和開發(fā)板的相同。

1b8e8786-92eb-11eb-8b86-12bb97331649.png

1b9bdbfc-92eb-11eb-8b86-12bb97331649.png

4. 開啟監(jiān)聽測試

使用SecureCRT軟件監(jiān)聽,除此之外,使用其他網(wǎng)口助手也可以。

1ba996d4-92eb-11eb-8b86-12bb97331649.png

1bbd4eb8-92eb-11eb-8b86-12bb97331649.png

1bd8475e-92eb-11eb-8b86-12bb97331649.png

1bf0090c-92eb-11eb-8b86-12bb97331649.png

1c05c8dc-92eb-11eb-8b86-12bb97331649.png

二、工程測試

1. 測試Echo官方例程

先打開串口,波特率115200,下載官方例程到ZC706開發(fā)板,連接SecureCRT_CN,初始化工程中串口打印信息如下:配置DCHP動態(tài)主機(jī)協(xié)議超時,自動轉(zhuǎn)為IPv4,將板子的IP地址配置為192.168.1.10,子網(wǎng)掩碼255.255.255.0,網(wǎng)關(guān)192.168.1.1,使用端口7。

1c347722-92eb-11eb-8b86-12bb97331649.png

在SecureCRT_CN界面輸入字符或字符串,回車,通過網(wǎng)口向開發(fā)板發(fā)送數(shù)據(jù),開發(fā)板會返回同樣的數(shù)據(jù),測試正確。

1c407914-92eb-11eb-8b86-12bb97331649.gif

2. 分析源碼

2.1 main函數(shù)

打開main.c文件,找到main()函數(shù)。在main函數(shù)中創(chuàng)建了一個線程,傳入的參數(shù)依次為線程名(調(diào)試用)、函數(shù)指針、函數(shù)需要的參數(shù)、需要的堆棧大小、優(yōu)先級。

按照如下配置,調(diào)用了main_thread函數(shù),不需要傳參(用0或NULL),堆棧大小由#define定義為1024,優(yōu)先級為2。

int main() { sys_thread_new(“main_thrd”, (void(*)(void*))main_thread, 0, THREAD_STACKSIZE, DEFAULT_THREAD_PRIO); vTaskStartScheduler(); while(1); return 0; }

2.2 main_thread函數(shù)

此函數(shù)中實現(xiàn)的功能如下:

(1)初始化lwip協(xié)議棧;lwip_init();

(2)調(diào)用network_thread()創(chuàng)建線程;

(3)調(diào)用echo_application_thread()創(chuàng)建線程;

每500ms檢測一次DHCP是否成功,若成功則創(chuàng)建echo應(yīng)用線程,如果10秒還沒有成功,則啟用IPv4,配置IP地址、子網(wǎng)掩碼和網(wǎng)關(guān)后,創(chuàng)建echo應(yīng)用程序;創(chuàng)建成功后退出while,配置完成;

while (1) { vTaskDelay(DHCP_FINE_TIMER_MSECS / portTICK_RATE_MS); if (server_netif.ip_addr.addr) { xil_printf(“DHCP request success

”); print_ip_settings(&(server_netif.ip_addr), &(server_netif.netmask), &(server_netif.gw)); print_echo_app_header(); xil_printf(“

”); sys_thread_new(“echod”, echo_application_thread, 0, THREAD_STACKSIZE, DEFAULT_THREAD_PRIO); break; } mscnt += DHCP_FINE_TIMER_MSECS; if (mscnt 》= 10000) { xil_printf(“ERROR: DHCP request timed out

”); xil_printf(“Configuring default IP of 192.168.1.10

”); IP4_ADDR(&(server_netif.ip_addr), 192, 168, 1, 10); IP4_ADDR(&(server_netif.netmask), 255, 255, 255, 0); IP4_ADDR(&(server_netif.gw), 192, 168, 1, 1); print_ip_settings(&(server_netif.ip_addr), &(server_netif.netmask), &(server_netif.gw)); /* print all application headers */ xil_printf(“

”); xil_printf(“%20s %6s %s

”, “Server”, “Port”, “Connect With.?!保? xil_printf(“%20s %6s %s

”, “--------------------”, “------”, “--------------------”);

print_echo_app_header(); xil_printf(“

”); sys_thread_new(“echod”, echo_application_thread, 0, THREAD_STACKSIZE, DEFAULT_THREAD_PRIO); break; } }

2.3 echo_application_thread函數(shù)

位置:echo.c文件。

(1)創(chuàng)建socket,綁定端口,監(jiān)聽;

(2)調(diào)用process_echo_request函數(shù)創(chuàng)建線程;

此函數(shù)需要傳入?yún)?shù)。

while (1) { if ((new_sd = lwip_accept(sock, (struct sockaddr *)&remote, (socklen_t *)&size)) 》 0) { sys_thread_new(“echos”, process_echo_request, (void*)new_sd, THREAD_STACKSIZE, DEFAULT_THREAD_PRIO); } }

2.4 process_echo_request函數(shù)

位置:echo.c文件,用戶需要注意的最重要的函數(shù),發(fā)送和接收的移植全部在這個函數(shù)。

(1)接收數(shù)據(jù),最大數(shù)據(jù)長度2048,char 類型,存儲在recv_buff 數(shù)組中,若接收出錯,打印錯誤信息并退出while;

(2)若接收到的數(shù)據(jù)的前4個字符為quit,則退出while;

(3)將接收到的數(shù)據(jù)發(fā)送出去;

void process_echo_request(void *p) { int sd = (int)p; int RECV_BUF_SIZE = 2048; char recv_buf[RECV_BUF_SIZE]; int n, nwrote;

while (1) { /* read a max of RECV_BUF_SIZE bytes from socket */ if ((n = read(sd, recv_buf, RECV_BUF_SIZE)) 《 0) { xil_printf(“%s: error reading from socket %d, closing socket

”, __FUNCTION__, sd); break; }

/* break if the recved message = “quit” */ if (!strncmp(recv_buf, “quit”, 4)) break;

/* break if client closed connection */ if (n 《= 0) break;

/* handle request */ if ((nwrote = write(sd, recv_buf, n)) 《 0) { xil_printf(“%s: ERROR responding to client echo request. received = %d, written = %d

”, __FUNCTION__, n, nwrote); xil_printf(“Closing socket %d

”, sd); break; } }

/* close connection */ close(sd); vTaskDelete(NULL); }

3. 測試網(wǎng)口發(fā)送數(shù)據(jù)

由2.4可知,在process_echo_request函數(shù)中更改發(fā)送即可。新增一個字符數(shù)組:

char tx_buf[16]={‘H’,‘e’,‘l’,‘l’,‘o’,‘,’,‘W’,‘o’,‘r’,‘l’,‘d’,‘

’,‘

’};

在發(fā)送完接收到的數(shù)據(jù)后,新增一個發(fā)送函數(shù),即可發(fā)送tx_buf數(shù)組,長度為16:

write(sd, tx_buf, 16);

1c712c4e-92eb-11eb-8b86-12bb97331649.png

4. 測試網(wǎng)口接收數(shù)據(jù)并控制LED

在向開發(fā)板發(fā)送數(shù)據(jù)時,規(guī)定一組特殊數(shù)據(jù),如“l(fā)ed0”、“l(fā)ed5”、“l(fā)ed8”等,前3個字符“l(fā)ed”用于指示這部分?jǐn)?shù)據(jù)是用于控制LED的,第4個字符表示點(diǎn)亮組合,四個LED使用二進(jìn)制編碼數(shù)據(jù)為0~15,注意,這里發(fā)送的是ASCII字符,在控制LED時需處理成數(shù)字(減 ’0’)。

接收到數(shù)據(jù)后,仿照函數(shù)中對quit字符串的處理方式,新增一個處理,將接收到的字符串與字符串“l(fā)ed”比較,如果收到的字符串的前3個字符是“l(fā)ed”,則使用第4個字符控制LED的亮滅。

strncmp函數(shù),字符串比較函數(shù),字符串大小的比較以ASCII 碼表上的順序來決定。函數(shù)聲明為int strncmp ( const char * str1, const char * str2, size_t n ),把 str1 和 str2 進(jìn)行比較,最多比較前 n 個字節(jié),若str1與str2的前n個字符相同,則返回0;若s1大于s2,則返回大于0的值;若s1 小于s2,則返回小于0的值。

if (!strncmp(recv_buf, “l(fā)ed”, 3)) { XGpio_DiscreteWrite(&Gpio_Led, 1, recv_buf[3]-‘0’); xil_printf(“Led Value = %d

”, recv_buf[3]-‘0’); }

1c7a59e0-92eb-11eb-8b86-12bb97331649.png

5. 測試LED任務(wù)及消息隊列

5.1 包含頭文件,聲明隊列

#include “FreeRTOS.h” #include “task.h” #include “queue.h” #include “timers.h” QueueHandle_t xQueue = NULL;

5.2 在main函數(shù)中創(chuàng)建消息隊列

傳入兩個參數(shù),分別為隊列長度和隊列中每個元素的長度,xQueueCreate(1,1) 表示隊列長度為1,隊列中的每個元素時一個char類型數(shù)據(jù),xQueueCreate(2,15) 表示隊列長度為2,每個元素都是一個char[15]類型的字符數(shù)組。

xQueue = xQueueCreate(1,1); /* Check the queue was created. 檢查隊列是否創(chuàng)建成功*/ configASSERT( xQueue );

5.3 在main函數(shù)中創(chuàng)建LED任務(wù),接收隊列消息

xTaskCreate( prvPlLedTask, ( const char * ) “PL Led”, configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);

其中,調(diào)用的prvPlLedTask定義如下,每次從隊列中讀取一個char類型的數(shù)據(jù),若隊列為空則等待,若隊列不為空則讀出后控制LED,注意這里的rece_led_value一定要加取地址符號&,表示傳入指針,否則出錯。

static void prvPlLedTask( void *pvParameters ) { const TickType_t x1second = pdMS_TO_TICKS( DELAY_1_SECOND ); char rece_led_value;

for( ;; ) { xil_printf( “PL LED task

” ); xQueueReceive( xQueue, /* The queue being read. */ &rece_led_value, /* Data is read into this address. */ portMAX_DELAY ); /* 延時 */

xil_printf( “PL LED task

” ); xil_printf( “rece_led_value = %d

”, rece_led_value-‘0’ ); XGpio_DiscreteWrite(&Gpio_Led, 1, rece_led_value-‘0’);

/* Delay for 1 second. */ vTaskDelay( x1second ); } }

5.4 在process_echo_request中添加發(fā)送隊列消息

若滿足條件,則將對LED的控制信息寫入隊列,注意要加取地址符號&。

if (!strncmp(recv_buf, “l(fā)ed”, 3)) { xQueueSend( xQueue, &recv_buf[3], 0UL ); }

1d086906-92eb-11eb-8b86-12bb97331649.gif

三、程序固化

1. 新建FSBL工程

1d8114b4-92eb-11eb-8b86-12bb97331649.png

2. 生成Boot鏡像文件

生成工程后,右鍵“Create Boot Image”,依次添加FSBL工程的elf(默認(rèn)已添加)、工程的bit文件(默認(rèn)已添加)、需固化的程序elf(Add找到路徑添加),“Create Image”。

1db1d3d8-92eb-11eb-8b86-12bb97331649.png

3. 燒錄QSPI Flash

選擇Image和FSBL的路徑,對Flash,一定選擇“qspi_dual_parallel”,若選擇“qspi_single”也能下載成功,但是無法加載,ZC706板載指示燈亮紅燈。

1de0b234-92eb-11eb-8b86-12bb97331649.png

4. 配置啟動模式

1df89fb6-92eb-11eb-8b86-12bb97331649.png

原文標(biāo)題:ZC706千兆網(wǎng)測試(ZYNQ,F(xiàn)reeRTOS,Echo,lwIP,TCP,RGMII)

文章出處:【微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

責(zé)任編輯:haq

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

    關(guān)注

    14

    文章

    7814

    瀏覽量

    90913
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    5675

    瀏覽量

    104572

原文標(biāo)題:ZC706千兆網(wǎng)測試(ZYNQ,F(xiàn)reeRTOS,Echo,lwIP,TCP,RGMII)

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

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

    何在EZ-USB SX3配置實用程序配置它的設(shè)置?

    SX3 UVC(CYUSB3017)是否可以使用圖像傳感器接口以非整數(shù)幀速率(如 29.97fps)傳輸 UVC 視頻? 如何在 EZ-USB SX3 配置實用程序配置它的設(shè)置?
    發(fā)表于 05-15 06:25

    何在Linux配置DNS服務(wù)器

    本文詳細(xì)介紹了如何在Linux配置DNS服務(wù)器,包括DNS工作原理、本地緩存、DNS查詢過程,以及正向和反向查詢的配置。步驟包括服務(wù)器配置
    的頭像 發(fā)表于 05-09 13:38 ?1404次閱讀
    如<b class='flag-5'>何在</b>Linux<b class='flag-5'>中</b><b class='flag-5'>配置</b>DNS服務(wù)器

    cat8網(wǎng)線支持千兆

    CAT8網(wǎng)線支持千兆網(wǎng)絡(luò),并且其性能遠(yuǎn)超千兆網(wǎng)絡(luò)的需求。 網(wǎng)線外皮上通常會印有“CAT5”、“CAT5E”、“CAT6”、“CAT6A”、“CAT7”或“CAT8”等字樣,這些標(biāo)識分別代表不同的網(wǎng)線
    的頭像 發(fā)表于 02-20 09:39 ?597次閱讀

    AN-0970: 使用ADuC706x微控制器實現(xiàn)RTD接口和線性化

    電子發(fā)燒友網(wǎng)站提供《AN-0970: 使用ADuC706x微控制器實現(xiàn)RTD接口和線性化.pdf》資料免費(fèi)下載
    發(fā)表于 01-14 16:00 ?1次下載
    AN-0970: 使用ADuC<b class='flag-5'>706</b>x微控制器<b class='flag-5'>實現(xiàn)</b>RTD接口和線性化

    utpcat5e網(wǎng)線支持千兆網(wǎng)

    速率足以滿足千兆以太網(wǎng)的需求。 應(yīng)用場景:由于千兆網(wǎng)絡(luò)在家庭和辦公室網(wǎng)絡(luò)環(huán)境中越來越普及,UTP CAT-5e網(wǎng)線因其較高的傳輸速率和較好的抗干擾能力,在這些環(huán)境得到了廣泛應(yīng)用。 一
    的頭像 發(fā)表于 12-12 10:39 ?2587次閱讀

    將ADC32RF42 EVM與xilinx ZC706開發(fā)板直接相連,JESD204B時鐘無法建鏈成功,為什么?

    您好,我將ADC32RF42 EVM與xilinx ZC706開發(fā)板直接相連,由LMK04828提供時鐘(ADC32RF42 EVM上的C409,C410被焊下,C431,C432用焊錫連接
    發(fā)表于 11-20 06:23

    ADS1299如何在寄存器配置右腿驅(qū)動?

    我的連接 如圖,想問如何在寄存器配置右腿驅(qū)動,是將CONF3配置成EC,BIAS SENSP和BIAS SENSN配置成EE嗎?還是說別
    發(fā)表于 11-19 07:53

    為什么通過SFP連接開發(fā)板,電腦顯示以太網(wǎng)未連接呢?

    想與開發(fā)板ZC706進(jìn)行以太網(wǎng)通信,為什么通過SFP連接開發(fā)板,電腦顯示以太網(wǎng)未連接呢?但是連接到RJ45就顯示未識別網(wǎng)絡(luò)(證明連上了)?
    發(fā)表于 10-11 15:10

    何在TAS2563配置PDM接口?

    何在 TAS2563 配置 PDM 接口?
    發(fā)表于 10-09 08:02

    何在反激式拓?fù)?b class='flag-5'>中實現(xiàn)軟啟動

    電子發(fā)燒友網(wǎng)站提供《如何在反激式拓?fù)?b class='flag-5'>中實現(xiàn)軟啟動.pdf》資料免費(fèi)下載
    發(fā)表于 09-04 11:09 ?0次下載
    如<b class='flag-5'>何在</b>反激式拓?fù)?b class='flag-5'>中</b><b class='flag-5'>實現(xiàn)</b>軟啟動

    官方,蜂鳥板只支持千兆網(wǎng),不兼容百兆網(wǎng)嗎?

    在論壇,有人提及了板子接入千兆網(wǎng),可以各種操作,如遠(yuǎn)程登錄等,但在接入百兆網(wǎng)時,卻卡在哪里不動 當(dāng)時我不以為然,今天周末試了下,同樣的操作,在公司可以登錄,但在家里卻不能,故懷疑公司
    發(fā)表于 08-19 10:19

    以太網(wǎng)端口和千兆端口的區(qū)別

    以太網(wǎng)端口和千兆端口在多個方面存在顯著的區(qū)別,這些區(qū)別主要體現(xiàn)在速度、應(yīng)用范圍、技術(shù)規(guī)格以及網(wǎng)絡(luò)性能等方面。
    的頭像 發(fā)表于 08-07 15:42 ?2434次閱讀

    何在FPGA實現(xiàn)隨機(jī)數(shù)發(fā)生器

    分享如何在Xilinx Breadboardable Spartan-7 FPGA, CMOD S7實現(xiàn)4位偽隨機(jī)數(shù)發(fā)生器(PRNGs)。
    的頭像 發(fā)表于 08-06 11:20 ?1194次閱讀
    如<b class='flag-5'>何在</b>FPGA<b class='flag-5'>中</b><b class='flag-5'>實現(xiàn)</b>隨機(jī)數(shù)發(fā)生器

    實測952Mbps!四路千兆網(wǎng)PCIe拓展方案,國產(chǎn)工業(yè)級!

    /4路千兆網(wǎng)口模塊方案:無錫沐創(chuàng)N500L-AM2C-DD、N500L-AM4C-QD測試工具:iperf3創(chuàng)龍科技已基于瑞芯微RK3588J、RK3568J處理器實現(xiàn)了PCIe拓展多路千兆
    發(fā)表于 07-25 14:57

    何在FPGA實現(xiàn)狀態(tài)機(jī)

    在FPGA(現(xiàn)場可編程門陣列)實現(xiàn)狀態(tài)機(jī)是一種常見的做法,用于控制復(fù)雜的數(shù)字系統(tǒng)行為。狀態(tài)機(jī)能夠根據(jù)當(dāng)前的輸入和系統(tǒng)狀態(tài),決定下一步的動作和新的狀態(tài)。這里,我們將詳細(xì)探討如何在FPGA設(shè)計
    的頭像 發(fā)表于 07-18 15:57 ?1225次閱讀