發表文章

目前顯示的是 7月, 2018的文章

多個客戶端連TCP_Server就有問題,lwIP的這個Bug,你一定要小心

怎麼去下載lwIP的源碼,怎麼去查看lwIP的buglist 這裡給出幾個lwIP官網的連結 lwIP官網:http://savannah.nongnu.org/projects/lwip/ lwIP的源碼下載地址:http://download.savannah.nongnu.org/releases/lwip/ lwIP的buglist查看:http://savannah.nongnu.org/bugs/?group=lwip TCP 的長連接與短連接 通常來說 TCP 有長連接與短連接之分。 長連接與短連接的區別在於: 長連接在連接建立以後,可以進行多次數據交互,通信完成以後再斷開連接,因為連接持續的時間比較長,所以叫長連接。 短連接是每進行一次數據交互都要按照建立連接 - 》數據交互 - 》斷開連接的 流程進行。因為每一次連接持續的時間比較短,所以叫短連接。 lwIP 協議在處理短連接時候的 bug 通常來說我們用的 TCP 客戶端都是基於長連接的,也就是說一旦連接建立以後,就基於這條連接上進行數據交互。比如說我們常用的網絡調試助手,但是也會有基於 TCP 短連接, Client 是長連接還是短連接,取決於客戶需求。但是使用 lwIP 的 RAW 搭建 TCP Server 的時候,要注意 lwIP 本身的一個 bug, 可能會造成基於短連接的客戶端連接問題。 ·          問題描述 : TCP 伺服器搭建完成以後,發現使用 TCP 客戶端連接以後 , 剛開始數據交互正常,但是一段時間以後,就無法發送了。 ·          問題測試 : 通過 wireshark 抓包發現,在 TCP 每一次發送數據之前都會重新連接,數據發送完成以後都會斷開連接,所以這個 TCP 客戶端是基於短連接的客戶端。 ·          問題分析 : wireshark 再次抓包發現, TCP 客戶端已經發出了握手的 SYN 數據包,但 Server 沒有任何的反饋 。於是打開 lwIP 的 TCP 調試選項發現在 tcp_listen_input : #if TCP_LISTEN_BACKLOG if (pcb->accepts_pending >

CCS6 Build Flash Image

在新建立的 CCS Project 無法產生燒入檔案來提供燒入 MCU 請依下面方式來產生所需檔案 在 Building 過程若無法產生檔案 請先執行  Clean Project 再重新 Build CCS6 Build Flash Image : Intel-BIN 在CCS 專案中 Project → Properties → CCS Build → Steps → Post-Build steps 輸入以下指令(一行輸入,不分行) "${CCS_INSTALL_ROOT}/utils/tiobj2bin/tiobj2bin" "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.bin" "${CG_TOOL_ROOT}/bin/armofd" "${CG_TOOL_ROOT}/bin/armhex" "${CCS_INSTALL_ROOT}/utils/tiobj2bin/mkhex4bin" Build Intel-HEX 若要增加 Intel-HEX 格式,則在同行後面增加以下指令 & "${CG_TOOL_HEX}" -i "${BuildArtifactFileName}" -o "${BuildArtifactFileBaseName}.hex" -order MS -romwidth 32 Build TI-TXT 若要增加 TI-TXT 格式,則在同行後面增加以下指令 & "${CG_TOOL_HEX}" --ti_txt "${BuildArtifactFileName}" -o "${BuildArtifactFileBaseName}.txt" -order MS -romwidth 32 Description 在 Description 說明 Post-Build steps 的功用(Post-Build steps 下方) Build create flash image:

TM4C MPU

TM4C MPU 可定義在一區塊中可分成8個相等的記憶體子區塊 要使用子區塊需使用大於 256 Bytes 大小的區塊 MPU 可用在所有區塊包含以下功能: Location Size Access permissions Memory attributes 而存取禁止區塊會造成記憶體管理錯誤 memory management fault 以下資料參考 TI TM4C LaunchPad Workshop MPU 內容 MPURegionSet()  uses the following parameters: Region number to set up Address of the region(as aligned by the flags) Flags Flags are a set of parameters(OR’d together) that determine the attributes of the region(size | execute permission | read/write permission | sub-region disable | enable/disable) The size flag determines the size of a region and must be one of the following: MPU_RGN_SIZE_32B MPU_RGN_SIZE_64B MPU_RGN_SIZE_128B MPU_RGN_SIZE_256B MPU_RGN_SIZE_512B MPU_RGN_SIZE_1K ... MPU_RGN_SIZE_512K MPU_RGN_SIZE_1M ... MPU_RGN_SIZE_512M MPU_RGN_SIZE_1G MPU_RGN_SIZE_2G MPU_RGN_SIZE_4G The execute permission flag must be one of the following: MPU_RGN_PERM_EXEC enable the region for execution of code MPU_RGN_PERM_NOEXEC disables the region

TI TM4C 關鍵功能 GPIO 保護

Critical Function GPIO Protetion TM4C123 MCU 上有六支腳位有防止編程意外保護 PC3, 2, 1 & 0 : JTAG/SWD PD7 & PF0 : NMI TM4C129 MCU 上有五支腳位有防止編程意外保護 PC3, 2, 1 & 0 : JTAG/SWD PD7 : NMI 上述腳位無法寫入以下暫存器,除非解鎖 GPIOLOCK: GPIO Alternate Function select register GPIO Pull Up or Pull Down select register GPIO Digital Enable register 說明解鎖 PF0 的 GPIOLOCK 暫存器: 1 2 3 HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; HWREG(GPIO_PORTF_BASE + GPIO_O_CR) |= 0x01 ; HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = 0 ; 可經由讀取 GPIOLOCK 暫存器狀態來判別鎖定情形 1 portf_lock = HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK); 資料來源: http://leapwing.github.io/2016/08/08/tm4c-GPIOprotection/

TI TM4C 使用 ROM APIs

TM4C123 MCU Calling APIs from ROM Build Project 會產生 map 檔案,在檔案內位於 SECTION ALLOCATION MAP 下可得知 section .text 的長度大小 TivaC Series device on-board ROM 包含 Peripheral Driver Library,可以從 ROM 中調用 Library 並不會增加 flash 記憶體大小 說明如何添加 ROM Library 的支持: 1 2 # define TARGET_IS_BLIZZARD_RB1 // or TARGET_IS_TM4C123_RB1 # include "driverlib/rom.h" Blizzard 是 LaunchPad 系列內置的 TI 產品名稱。此定義會存取正確 ROM Library APIs 只需將  ROM_  加至 DriverLib 前方: 在  SysCtlClockSet(SYSCTL_SYSDIV5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);  前方加入  ROM_ 變成  ROM_SysCtlClockSet(SYSCTL_SYSDIV5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ); 並將相關 DriverLib 一併修改 可再重新 Build Project 檢視修改成 ROM Library APIs 後檢查 map 檔案減少多少 flash 記憶體 TM4C129 MCU Calling APIs from ROM 說明如何添加 ROM Library 的支持: 1 2 # define TARGET_IS_TM4C129_RA1 # include "driverlib/rom.h"

TI TM4C ROM Bootloader

使用 TM4C ROM bootloader 的三種方式: Flash Empty 當 MCU Flash Address 0x00000004 內容值是 0xFFFFFFFF 會直接進入 HW ROM Boootloader (Power ON or RESET) 也就是說MCU 內是沒燒入程式或是 Flash Erease 的狀態 BOOTCFG Setting GPIO 修改 BOOTCFG register 可指定 GPIO 強制進入 ROM Bootloader 這邊說明使用 GPIO PF4 Keep LOW 進入 HW ROM Bootloader (Power ON or RESET) 當程式設定過後就不會再執行此設定 若要清除改變設定,就要回復到預設狀態 利用 Tool 清除 LM Flash Programmer → Other Utilities → Debug Port Unlonk → Select  Fury, DustDevil, TM4C123 and TM4C129 Classes  → click unlock 1 2 3 4 5 6 7 8 9 10 11 12 void CheckBootloaderCFG ( void ) { unsigned long bootcfg; bootcfg = HWREG(FLASH_BOOTCFG); if (bootcfg & FLASH_BOOTCFG_NW) { HWREG(FLASH_FMA) = 0x75100000 ; HWREG(FLASH_FMD) = FLASH_BOOTCFG_PORT_F | FLASH_BOOTCFG_PIN4 | FLASH_BOOTCFG_KEY | FLASH_BOOTCFG_DBG1; HWREG(FLASH_FMC) = DLASH_FMC_WRKEY | FLASH_FMC_COMT; while ((HWREG(FLASH_FMC) & FLASH_FM

CCS6 在 Debug 中利用中斷計算執行時間

若想知道某段程式執行多少時間 CCS6 Debug 可利用 Breakpoints 來設定計算指令 cycles 先移除所有中斷 Run → Remove All Breakpoints 再設定要計數的起始中斷點 執行程式  Resume  讓程式跑到中斷點 在 Breakpoints 視窗中滑鼠右鍵點選 Breakpoint(Code composer Studio) → Count enent → Clock Cycles → OK 再設定另一中斷點在要計算的程式之後 在 Breakpoints 視窗中滑鼠右建點選 Count Event → Breakpoint Properties… 確認勾選 Reset Count on Run 讓程式每當  Resume 執行時清除計數值 當執行到下個中斷點 Count Event 的 cycle count 會自動更新 若此值若為 6423 ,而系統的頻率為 80MHz ,換算成執行時間就是 80us 資料來源: http://leapwing.github.io/2016/08/22/ccs6-profilingcode/

TM4C New Project for CCS

CCS6 Tiva-C 建立新 project 步驟整理: File → New → CCS Project. 填入需求 target-specific 項目. 來選定 device. Device Target = TM4C123GH6PM, Connection = Stellaris In-Circuit Debug Interface Project name : 輸入專案名稱 (use default workspace path) Project Template : 使用 TI-RTOS 應用, TI-RTOS Examples → EK-TM4C123GXL Evaluation Kit → Driver Examples → TI Driver Examples → Empty Examples → Empty Project. 不使用 TI-RTOS 應用, 直接選 “Empty Project” RTSC Settings : 使用 TI-RTOS 應用, click “Next” 來配置工具 – 選擇最新版 XDC, TI-RTOS, UIA. 不使用 TI-RTOS 應用, click Finish File Mgmt : 檢查專案資原檔案及結構. Linker Command File : 再一次檢查 linker.cmd 檔案必須在專案內. Edit vars.ini : 修改 vars.ini 正確符合 TIVAWare 安裝路徑 TIVAWARE_INSTALL = your install path Import vars.ini : 需在 workspace 中完成一次, import vars.ini 選擇 File → Import → CCS → Build Variables, 然後 click Next, 檔案選到 vars.ini 位置, 勾選 “Overwrite existing values”, click Finish 完成匯入到 workspace Add Include Search Path : 專案上點擊滑鼠右鍵, 選擇 Properties, 再選 Build → Compiler → Include Options. 然後使用變數 –

Eclipse使用sublime主題

圖片
話說自從使用了 sublime 之後 , 寫 html 的效率提高了好多 , 而且 sublime 預設的主題就很好看 . 每次使用 eclipse 的時候 , 都覺得主題醜爆了 . 覺得應該有人跟我一樣的吧 , 不喜歡他預設的那幾個主題 . 百度找了一下 , 發現還真的已經有前人造好了輪子 , 既然輪子都造好了 . 我就拿來用了 . 官方網站 : http://eclipsecolorthemes.org/?view=plugin 我們在 eclipse 裡 , 直接安裝外掛程式就好了 . 點擊 eclipse 裡的 help->install new software. 然後點擊快顯視窗的 add, 名字可以隨便起一個 ,URL 位址填寫 : http://eclipse-color-theme.github.io/update/ 點擊 OK 之後 , 下面的外掛程式全部選上 , 然後按照嚮導安裝即可 . 安裝完成之後 , 會提示重啟 eclipse. 重啟完成之後 , 點擊 window->Preferences , 然後照下圖選擇

Eclipse背景顏色、字體配置和語法高亮

圖片
改變背景顏色: windows->Preferences->General->Editor->Text Editors 右邊選擇 Appearance color options  選 Background color 選擇背景顏色 個人比較舒服的豆沙綠色和黑色背景,但黑色背景還要把其他的字體顏色也改了才好看,而且豆沙綠色跟預設的字體顏色搭配的很好。 豆沙綠色(色調: 85   飽和度: 123   亮度: 205 ) ( MAC 下的顏色     背景色 RGB 為 199 , 237 , 204 ) 據說這個色調是眼科專家配的, 因其顏色比較柔和,據說閱讀的時候用這種顏色做背景有利於保護眼睛, word 底色就許多人設置成豆沙綠色。 xml 的字體調整:   window--preferences--General--appearance--colors and fonts--Basic-- "Text font "   然後點 change, 可以設置字體,我喜歡 Courier New Java 的字體調整:   window--preferences--General--appearance--colors and fonts--java  調整語法高亮: window--preferences--java-Editor--Content Assist--Mart occurrenecs 然後全選