平時工作學習記錄


Table of Contents

note :note:

Microchip :microchip:

mplab x

debug

when debuging,you'd better select the project title first.

otherwise, it will be not up to date.

pic32

有時會出現

Unable to connect to the target device.
Failed to get Device ID
方法:將usb下載線斷開重新連接即可

stm32 :stm32:

HAL庫使用

  1. hal庫帶有IT中斷的API,最好不要使用在task中

  2. uart api

    1. HAL_UART_Receive_IT()這個函數中所接收的數據長度必須和發送的數據長度一致否則容易出錯
      有待改進為可以接收任意長度的數據
    2. HAL_UART_Receive_IT()接收數據的時候直接指定數據長度即可
  3. systick_handler

    1. 無法進入systick中斷
      要使相關_weak函數有效
  4. timer

    1. 定時器啟動需要在freertos啟動后bsp_tim_on
  5. eeprom

    1. 24C512的內存地址是16位的,使用IIC要注意

freertos on stm32

  1. NVIC_PriorityGroup_4 should be selected

2 logical priority is the true priority

  1. critical,spinlock,mutex

    1. critical–> disable interrupt, 保證該區間的代碼不會被中斷
    2. spinlock–> lock the cpu , 保證該區間的代碼不會被其他CPU訪問
    3. mutex–—> change the priority of the task/process, 保證該區間的代碼不會被更高優先級的任務所搶占

jlink下載不成功

iar

  1. stm32 start up .s files need to be modified something

    1. REORDER -> NOROOT
  2. 使用stm32,記得更改jtag/swd模式

  3. iar 調試stm32出現的問題

    1. debug under Reset原因

      1. swdio swclk 接反
      2. startup啟動文件不匹配
  4. iar和keil的一個區別

    在選擇sram啟動的情況下,keil中下載完程序后不能繼續仿真調試,
    iar沒影響

  5. iar中要設置use_cmsis,不然問題很多

  6. iar warnings

keil

keil中的優化等級有可能會導致編寫的邏輯被優化掉,不能正常執行。

  1. 數組未初始化,如果其前后有變量,會造成該變量出錯,進入hard_fault

uart :stm32_uart:

  1. usart2 配置的時候注意usart2的時鍾位於apb1上,而默認的io口為PA口,位於apb2時鍾上

  2. uart 接收

  3. stm32f4,f7的usart GPIO配置中多了一個AF選項

spi

  1. full-duplex(4根線)

    該種模式使用MOSI和MISO兩根線

  2. half-duplex(3根線)

    該種模式將會設置BIDIMODE bit,主模式使用MOSI線,從模式使用MISO線

isp 下載 :isp:

  1. 使用uart1 串口下載 flsh loader BOOT0=x BOOT1=1, 當前ch340的電路可用
  2. BOOT0 BOOT1 接到VCC或GND最好不要加電阻

stm32l073

  1. low power mode

    1. low power run mode

      1. regulator in low-power mode
      2. limited clock frequency
      3. limited number of peripherals
    2. sleep mode

      1. M0+ core stopped, peripherals keep running
    3. low power sleep mode

      1. regulator in low-power mode
      2. limited clock frequency
      3. limited number of peripherals
      4. M0+ core stopped
    4. stop mode

      1. all clocks are stopped
      2. regulator runing
      3. regulator in low-power mode

problems and because

  1. 串口波特率太低,可能導致idle中斷提前產生

  2. 程序出現問題時,可以找個已有的ok程序下進去

  3. lpuart-lsi-不支持115200

  4. lpuart無緣無故進接收中斷,可能是接收引腳沒連上,引腳懸空,電位為0

lwip

  1. 板子端為客戶端時

    注意電腦端作為服務器,需要將公用網絡的防火牆關掉

  2. lwip 中的優先級比正常賦值高3個值

  3. 電腦端服務器開啟,客戶端才能連接上

PIC

pic16 :pic16:

pic18 :pic18:

  1. 18f452

pic24 :pic24:

dspic30 :pic30:

pic32 :pic32:

c8051 :c8051:

stc12/15 :stc:

debug the flash

注意調試好軟件功能后,再添加flash寫的功能,防止寫的次數超過最大的次數。

PCB :pcb:

PCB繪制出來后仔細檢查

  1. 檢查所有的網絡標號,尤其是電源

  2. 繪制元件時注意標號和名稱問題,否則可能出現Unkonwn Pins

  3. 對於USB這樣的差分線添加要在輸出端添加串聯電阻,進而達到阻抗匹配的效果

  4. 檢查有沒有未連接的線

  5. 檢查所有的GND,VCC是否已經連接

pcb

繪制注意事項

cyclone_tcp網絡調試 :cyclone_tcp:

網絡指示燈不亮可能是電源供電不夠

網絡指示燈黃燈不閃,ping不通可能是網線接觸不良

freertos :freertos:

xSemaphore

1.xSemaphoreGive never blocked
2.xSemaphoreTake blocked
3.xSemaphoreGive can be sent conditionally
4.counting_semaphore–

xMutex

queue

queue必須要在使用它的所有任務運行之前創建

  1. 發送隊列的任務優先級高,接收隊列的任務優先級低–不需要
  2. 或者理解為必須先發送一個隊列,然后才可以接收一個隊列

vPortStartFirstTask

priority

zero->loweset prioity configMAX_PRIORITIES->highest priority

sample the ds18b20

  1. esp32 采集ds18b20

    1. usleep() 實現微秒延時

    2. 延時不准是由於GPIO中加入了串口打印

生活領悟

工作和生活的同時,關注一下社會,以后可能會避免更多的禍事

esp32 :esp32:

esp32環境搭建注意事項 :esp32:

  1. msys環境下的串口指定應該為/COM8格式

    /COM3—對應Windows下真實的串口
    COM口編號最好是3以下

  2. 基本使用步驟

    只能使用mingw32模式,不能使用msys,在app下輸入eg:hello,world

    1. make menuconfig
    2. make flash
    3. make monitor
  3. 只對app進行編譯下載

    make app-flash

  4. clone the ESP-IDF

    git clone –recursive https://github.com/espressif/esp-idf.git

  5. Updating ESP-IDF

    cd ~/esp/esp-idf
    git pull
    git submodule update –init –recursive

  6. uart下載 要拉低GPIO0

  7. esp32–micropython

    1. msys2

      1. python -m pip install esptool or pip2 install esptool

      2. esptool.py –chip esp32 –port /dev/COM3 erase_flash

      3. esptool.py –chip esp32 –port /dev/COM3 write_flash -z 0x1000 ~/esp/micropython/esp32-20180901-v1.9.4-479-g828f771e3.bin

      4. pip install adafruit-ampy –upgrade

      5. ampy –port COM3 –baud 115200 put ~/esp/micropython/main.py

        1. 注意關掉COM3

        2. 然后上傳main.py

  8. esp32 MH-ET LIVE

    1. led -> GPIO2
  9. esp32 smart_config

    esp_smartconfig_set_type(SC_TYPE_ESPTOUCH_AIRKISS);

  10. esp32 freertos

    1. portENTER_CRITIAL(mux) 與 portEXIT_CRITIAL(mux)必須成對出現

esp32-error

  1. 堆棧宏和優先級宏的位置顛倒

tenda路由器N300 v3固件升級步驟

按住復位鍵,然后同時按住電源鍵

然后在瀏覽器中輸入路由器的ip地址,按照提示選擇文件,進行升級即可

cc2530調試 :cc2530:

當使用查詢標志發送數據時,不能使能中斷

對於OSAL中的bool,不能使用IAR自帶的stdbool中的,否則可能不能使用

s3c2440

添加target /arch/kconfig中

匯編指令

  1. mrs—move cpsr or spsr to r0-r13
  2. msr–相反
  3. ldr
    1. ldr{cond}Rm, =addr
      • 大范圍讀取偽指令
      • Rm為加載的目標寄存器
      • addr為32位立即數或基於PC的地址表達式或外部表達式
      • 配合ltorg(聲明文字池)指令使用
      • 偏移量小於4kB
    2. ldr{ } Rd, addr
      • 數據加載指令與是str相反
      • 將內存addr處的數據加載到Rd中去
  4. .word
    1. .word 0x01-在當前地址放一個值為0x01
  5. ldr r3, [r0], #4
    把r0地址處的內容放到r3,然后r0+4

模式

SVC–超級用戶模式,操作系統使用的保護模式
armv4-v6_ref–page49
armv7_ref–page

u-boot :u👢

  1. CONFIG_SYS_TEXT_BASE

    理解:連接開始地址,可以理解為運行地址

linux :kernel:

  1. 一些關鍵符號表達的理解

    1. __atags_pointer -> head-common.s-> r2
    2. setup_machine_fdt -> 使用dtb setup_machine_tags -> 使用atags
    3. init_mm -> init-mm.c
    4. CONFIG_CMDLINE->default_command_line->from->boot_command_line->cmd_line->tmp_cmdline,cmdline_p

zynq :zynq:

u-boot sequence :u-boot:

start.s->cpu_init_cp15—>cpu_init_crit->lowlevel_init(mach-zynq/lowlevel_init.s)
->_main(crt0.s)->board_init_f(common/board_f.c)->init_sequence_f(common/board_f.c)
->relocate_code(relocate.s)->relocate_vectors(relocate.s)->c_runtime_cpu_setup(start.s)
->board_init_r(common/board_r.c)->init_sequence_r(common/board_r.c)->run_main_loop(common/board_r.c)
->main_loop(main.c)->bootdelay_process()->autoboot_command(s)->cli_loop->cli_simple_loop()(for(;😉)
command parse
run_command_list(s, -1, 0)->cli_simple_run_command_list(buff, flag)->cli_simple_run_command->cmd_process
->cmd_call(cmdtp, flag, argc, argv)
bootm->do_bootm->do_bootm_states->boot_fn->do_bootm_linux->boot_jump_linux->kernel_entry(0, machid, r2

linux sequence :linux:

compressed/head.s->
head.s->__mmap_switched(head-common.s)->start_kernel(main.c)->rest_init
->kernel_thread->kernel_init

u-boot memory

sp->CONFIG_SYS_INIT_SP_ADDR 0xFFFF0000+0x1000-GENERATED_GBL_DATA_SIZE
sp->(sp-GDSIZE) CONFIG_SYS_INIT_SP_ADDR-184

linux 輸出頭文件

The command "make headers_install_all" exports headers for all architectures
simultaneously.

msys2

pacman -Syu ,更新整個系統

pacman -S mingw-w64-x86_64-toolchain 安裝工具鏈,

如果提示沖突,則使用pacman -S –force mingw-w64-x86_64-toolchain
pacman -S base-devel 開發的各種輔助工具
pacman -S –force mingw-w64-x86_64-gtk3 安裝gtk

msys2 .bashrc中為應用程序添加相應的環境變量即可

msys2 中使用cmake

要指定編譯的工具路徑
export CC=/c/msys64/usr/bin/x86_64-pc-msys-gcc
export CXX=/c/msys64/usr/bin/x86_64-pc-msys-g++
指定生成的Makefile文件類型為MinGW Makefiles
cmake -G "MinGW Makefiles" .
cmake -G "MSYS Makefiles" .
cmake 中的環境變量的設置一律使用大寫

msys2 中使用bash 來執行shell腳本

cc2540調試

退出調試狀態,可能一切都會回復正常

常見的dns服務器地址

180.76.76.76 182.254.116.116

android studio :asstudio:

onCreate

頁面創建的時候執行

onDestroy

頁面銷毀的時候執行

onRequestPermissionsResult

權限的回調

onActivityResult

頁面的回調

onCreateOptionsMenu

創建按鈕之后的回調

adb 連接手機有的電腦,要將usb切換為非MTP方式

常用的程序調試方法總結 :debug:

比較法

通過比較當前版本的程序和之前的程序,有哪些區別來定位產生問題的根源

jlink–iar問題

將KEIL低版本的jlinkARM.dll copy 到 IAR/bin就可以了,不會再彈出問題框

zephyr :zephyr:

download

git clone https://github.com/zephyrproject-rtos/zephyr.git

emacs :emacs:

org

  1. 條目及子條目左移和右移 M-S-左箭頭和右箭頭,或者C-c n k C-c n l
  2. M-RET 創建同級新條目
  3. org文件中的內容,可以使用tags的方式變為agenda,方便快速定位,條目的名字不能和文件名重復,首字母都不可以

org模式重要快捷

  1. C-c a 調出agenda
  2. C-c / sparse-tree 快速查找條目,准確定位
  3. M-RET 快速新建子項
  4. M-S-RET 快速新建子項,並帶有編號或者TODO
  5. C-c * 將普通行變為標題行
  6. S-left 改變標號的式樣eg. 1. 1) + -
  7. 8標題表示的為checkbox
  8. [0%]
    1. [ ]
    2. [ ]
    3. [ ]
    4. [ ]
    5. [ ]
  9. C-c . 設置時間戳
  10. org-check-deadlines
    1.

zip/unzip

  1. zip: mark the files -> ! zip -r(dir) name
  2. unzip: mark the .zip -> ! unzip

emacs to do

  1. 實現C-i C-i, 命令在終端模式的補全

emacs版本問題

以后業余時間不足,不在嘗試新的版本,之后在經濟狀況改善之前,要
一直使用emacs24.5這個版本,可以對它的一些功能進行優化。
更多的時間放在利用其解決實際問題上。

emacs 瀏覽大文件問題

font-lock造成的

debug :debug_skills:

  1. ds18b20 調試

    (比較法)調試DS18b20, 使用PA4可以,使用PA5不可以,那就說明沒有將所有與IO相關的地方都改掉

altium :altium_skills:

rules

  1. 常規板子孔大小(12 20) (16 30) (20 40)(mil)
  2. 元件名字體大小(5(w) 50(height))(mil)

keys

  1. j-c -> 跳到某個元件
  2. s-p -> 選中某一條線(pcb)

cadence :cadence_skil

tim2 :stm32_tim2:

  1. 進入中斷先清除標志位,再處理數據

Dwin

DMT48270C043_07MTZ2

  1. 480*272 16:9 DGUSII 5V 200mA 1G
  2. 查詢版本號命令
    1. 5A A5 04 83 00 0F 01 + 發送新行
    2. 返回5A A5 06 83 00 0F 01 23 21

比較少見的無線通信技術 :Wireless:

UWB

無載波通信技術,采用時間間隔小於1ns的脈沖進行通信,因此也稱為脈沖無線電

通過在較寬的頻譜上傳送極低功率的信號,UWB能在10米左右的范圍內實現
數百Mbit/s至數Gbit/s的數據傳輸速率。UWB具有抗干擾性能強、傳輸速率高、
帶寬極寬、消耗電能小、發送功率小等諸多優勢,主要應用於室內通信、高速無線LAN、
家庭網絡、無繩電話、安全檢測、位置測定、雷達等領域。

LORA

是LPWAN通信技術中的一種,是美國Semtech公司采用和推廣的一種
基於擴頻技術的超遠距離無線傳輸方案,為用戶提供了一種簡單的能實現遠距離、
長電池壽命、大容量的系統,進而擴展傳感網絡,目前,LORA主要在全球免費頻段運行
,包括314、868、915MHz等。

Thread

office

word

當文字下方有空行時,要更改段后間距

visio 2007

調整畫布的尺寸

文件-> 頁面設置 —> 頁面尺寸

excel

表格內換行

ALT+ENTER

拆分表格

右鍵插入,表格右移

technology :technology:

技術選擇與鞏固

立足當下的積累,創造未來的財富
軟件編程的鐵律:感覺會出錯的地方一定會出錯,同樣感覺OK時,已經接近OK了

編程語言

核心語言:c,verilog

  1. asm :asm:

  2. c/c++/java/go

    1. c :c:

      1. c 語言常見問題

        1. volatile
          使用volatile后,每次變量的操作都會從變量定義的地址進行存取
          不使用volatile,程序優化后變量的操作可能從寄存器中存取
        2. 堆棧溢出
          1. 函數調用層次太深(循環遞歸)
          2. 動態申請空間使用之后沒有釋放
          3. 數組訪問越界
            在c語言中,只要不是受限的內存,所有的內存空間都是可以自由訪問的,那么一個
            為定義的數組變量也會被定位到某個地址上
          4. 指針非法訪問
          5. 局部數組變量空間太大
        3. = 和 = 程序寫完后要檢查 和 == 寫的是否合理
        4. typedef 和 define
          1. 取別名時要使用typedef,編譯階段處理
          2. define 主要用於宏替換,預處理階段處理
          3. typedef 有文件作用域,define沒有
          4. 定義指針時,define容易出錯
      2. 內存分配

        內存基本由以下部分組成:靜態存儲區,堆區,和棧區,代碼區

        1. 靜態存儲區:.data(.rodata)區, 在程序編譯時就已經分配好了,主要存放
          static變量,全局變量,和常量
        2. 堆區:動態內存分配,用於程序運行時分配內存,使用malloc或new申請內存大小,
          然后使用free或delete進行釋放,該區最容易發生內存泄漏現象。
        3. 棧區:在執行函數時,用於存放局部變量,函數執行完后,釋放局部變量
        4. 代碼區:存放函數內的二進制代碼
        5. C51內存分配
      3. 內存泄漏

        我們自己不用也不讓別人使用的內存區域,為內存泄漏區

    2. c++ :cpp:

    3. java :java:

    4. go :go:

  3. python/shell/tcl/lisp(elisp)/do

    1. python :python:

    2. shell 🐚

      1. sed

        1. 替換字符串 sed "s/f104/f103/g" f103_freeos_test.eww g->全部替換
    3. tcl :tcl:

    4. elisp :elisp:

    5. do :do:

  4. makefile/cmake

    1. makefile :makefile:

    2. cmake :cmake:

  5. verilog/vhdl/systemverilog

    1. verilog :verilog:

    2. vhdl :vhdl:

    3. systemverilog :systemverilog:

  6. matlab/simulink/stateflow/labwindows/qt

    1. matlab :matlab:

    2. simulink :simulink:

    3. stateflow :stateflow:

    4. qt :qt:

    5. labwindows :labwindows:

  7. mysql :mysql:

編程思想

  1. 框架

    1. 狀態機
    2. 並發
    3. 並行

office辦公

  1. wps

  2. visio

以后單片機開發選擇

  1. 8bit ->

    1. 首選 STC12,15 和 PIC12,PIC10,PIC16,PIC18

    2. 其次 C8051 EFM8 AT89C51 TM52 HS8

  2. 16bit ->

    1. 首選msp430 dsPIC

    2. 其次PIC24 HS12

  3. 32bit ->

    1. 首選STM32, PIC32, EFM32, TM320Fxxxx

    2. 其次GD32,SAMXX

  4. 無線通信技術 ->

    1. 首選 TI CC系列 和 ESP32

    2. 其次 MSP432 NORdic SAMXX EFM32

  5. IC

處理器選擇

  1. 國產瑞芯微和全志,華為海思

  2. 國外TI DSP,altera,xillinx和NXP IMX

  3. 國外microchip-cortex-A5

開發模式

  1. 統一采用emacs+IDE/GCC的開發模式,雙屏/三屏開發

    1. 主打IDE–> (iar keil mplabx ccs) windows
    2. 命令行–> emacs+gcc+gdb+gdbserver 模式 linux
    3. mplabx 已經開始支持avr和sam系列
    4. iar和keil,雖然是主力開發ide, 如果涉及收費,看自身情況,不在乎那些錢可以繳納
    5. ccs已經免費,可以考慮ti的器件代替其他的器件,msp430也可以從iar轉向ccs
    6. 最后可以轉向arm-gcc-mcu開發,只是將工程換一個環境而已很快的
  2. 每個工程采用的IDE版本號要做記錄,防止移植帶來的時間開銷

RTOS

  1. FreeRTOS 和 ucOSII/III 和 Zephyr 和 RTEMS 和 alios

rich os

  1. Linux 和 Android 和 openwrt 和 ubuntu

技術層次

  1. 技術層次應該由廣度向深度方向轉變
  2. 做好技術資本的原始積累
  3. 通過實踐增進認知,增強信心, 為以后大項目打基礎
  4. 通過matlab/simulink增強自己的算法能力,為之后解決實際問題,提供更多思路
  5. 反對重新造輪子,要站在更高層次來考慮問題
  6. 注重設計思想的培養,設計思路的完善,設計能力的提升,總之設計高於一切

技術態度

  1. 無論學習,掌握了多少令自己沾沾自喜的技術,都不能成為負擔
  2. 學習技術,不能以犧牲健康為代價,要細水長流
  3. 工作是為了更好的生活
  4. 隨着能力的提高,收入自然而然會不斷增多,沒必要為錢而苦惱
  5. 能力到了,一切自然而然,錢會自動來找你

技術路線

  1. 從熟悉到熟練,從熟練到精通,從精通到產品
  2. 讓每次實驗或試驗都變成實實在在的利潤回報
  3. 自己所做的所有代碼,無論多差,都不能丟棄,這是自己勞動換來的
  4. linux內核的代碼被刪除,損失無疑是巨大的,同樣自己的勞動成果,被廢棄同樣是一筆巨大的損失
  5. 要及時做好備份
  6. 以硬件應用為主,少從事固件級的開發,優先選擇AT指令成型的模塊
  7. 以后如果進行自主開發,可以考慮進行固件級開發(固件級開發極度耗時)

技術策略

  1. 優先選擇已有的
  2. 多參考人家的
  3. 多利用已有的
  4. 創新能力不足,可以通過善於學習來彌補

項目開發實施策略

軟件

  1. NO OS

    1. 每種主控芯片要有自己的test工程

      test工程,涵蓋總的庫文件,測試代碼,還有實戰代碼,
      都以.c,.h,函數的方式存在,test工程的庫要不斷增大
      允許不同的單片機有不同的驅動

    2. 獨立的項目建立在test工程的基礎之上

      每個獨立的項目只含有,該項目所必須的代碼,非必須代碼存在於test總工程中

    3. 慢慢的提高開發速度,繼續增強emacs快速編輯能力

    4. 用org管理自己的項目,記錄自己的經驗

    5. 尤其是使用YASnippet,擴充模板庫

    6. 將最寶貴的時間集中在解決問題的思路上

    7. 對於每個項目都寫一個readme.org

      介紹功能,注意事項,參考書籍,知識等等相關問題。

    8. 項目和項目之間工程是可以衍生,復用的

  2. OS

    1. LITTLE OS

      1. freertos或ucos或zephyr

        同上面一樣

    2. MIDDLE AND BIG OS

      1. linux或rtems或openwrt或ubuntu

        1. 對於文件較多的大系統只要一個test工程就好啦
          然后以應用來區分
        2. Android 和 ubuntu的體積過大,以后要靠更強勁的電腦來做
    3. 首選freertos和linux

      先精通freertos和linux,之后rtems等

  3. GUI

    1. GUI:emwin, touchgfx, QT, android app

硬件

  1. PCB

    1. pcb 繪圖工具

      1. altium,cadence
    2. 每個項目必須有自己的PCB

    3. 項目與項目之間可以有PCB的復用

  2. 產品

平時訓練

自己寫test,單片機以stm32為主,ARM處理器以RK和zynq為主,然后OS以FreeRTOS和linux為主

單片機精析

51單片機

  1. 啟動流程

  2. 特點

    1. 函數形參的存儲順序為從左到右
  3. 可重入函數

    可以被中斷的函數,而不必擔心數據錯誤
    典型特點:

    1. 沒有靜態數據結構(全局變量,靜態變量)
    2. 不返回指向靜態數據的指針
    3. 所有函數數據由函數調用者提供(通過傳參的形式)
    4. 使用自動變量,或通過全局變量的拷貝來保護全局變量
    5. 若必須訪問全局變量,則利用互斥信號加以保護
    6. 不調用不可重入函數

    在單線程進程(單任務)中,無需重點考慮其可重入性,因為只存在一個控制流
    在多線程進程(多任務)中,要考慮函數的可重入性,因為相同的資源可以通過
    多個控制流並發訪問。

  4. 不可重入函數

    1. 不能運行在多任務環境下,除非能保證互斥
    2. 是由於使用了未受保護的系統資源,如全局變量區,中斷向量表

    典型特點:

    1. 函數中使用了靜態變量
    2. 函數返回靜態變量
    3. 調用了不可通入函數
    4. 函數內使用了靜態的數據結構
    5. 函數體內調用了malloc
    6. 函數體內調用了其他標准I/O函數

stm32單片機

  1. 啟動流程

單片機程序設計注意事項

  1. 使用盡量小的數據類型
    1. 能用unsigned就不使用signed
    2. 能用char就不用int
    3. 能用位操作的就不用算術
      • 2 和 除以4前者消耗的時間較少

  2. 使用自加自減指令
    a = a+1, 不如 a+=1生成的匯編代碼高效,因編譯器優化而異
  3. 減小運算強度
    1. N = N%8 可以改為 N = N&7
    2. N = pow(3, 2)可以改為N = 3*3
  4. 函數和宏
    函數占用時間多一些,宏占用的空間多一些,所以為保證程序執行的速度,
    有些地方可以使用宏代替函數來實現
  5. 用指針代替數組
  6. 強制轉換

單片機前后台設計理解

對於單片機前后台設計,前台中斷的優先級相對較高,然后由於后台的程序
在while(1)中,整個執行完也就在3ms以內,所以其中的並列的函數判斷在一定程度上可以認為是
並發執行的,有着並行的感覺,而要實現順序的功能,則要加入條件限制,例如狀態控制。
還需要在實際使用中繼續體會

linux :linux_record:

u-boot :u_boot:

myday :myday:

usual_path :usual_path:

c:/Users/lenovo/Desktop/

C:/Users/hanxiaosong/Documents/Tencent Files/1054125296/FileRecv

atitude_change :atitude:

my atitude to life shoulde be changed.

else life will be meaningless.

emacs

emacs_command :cmd:

  1. C-c i -> Code cscoped
  2. C-c o -> gtags-update
  3. C-c y -> 有道詞典
  4. C-c C-v -> yas-visit-snippet-file
  5. C-c q -> formats-code
  6. C-j -> avy-goto-char
  7. C-q -> set-mark-command
  8. C-; -> save-all
  9. C-r -> read-only-mode
  10. C-c n h -> org-metaleft
  11. C-c n j -> org-metaright
  12. C-c n k -> org-promote-subtree
  13. C-c n l -> org-demote-subtree
  14. C-c C-j -> helm-cscope-find-global-definition
  15. C-c C-c -> helm-cscope-find-calling-this-function
  16. C-c C-k -> helm-cscope-find-this-symbol
  17. C-c C-f -> helm-cscope-find-this-file
  18. C-c C-g -> helm-cscope-find-egrep-pattern
  19. C-c C-a -> helm-cscope-find-assignments-to-this-symbol
  20. C-c C-l -> helm-cscope-pop-mark
  21. C-M-n -> next-line 5
  22. C-M-p -> previous-line 5
  23. M-m -> er/expand-region
  24. M-j -> helm-gtags(C-mode)
  25. M-k -> helm-imenu
  26. C-M-j -> winner-undo
  27. C-M-k -> winner-redo
  28. C-c m -> mc/edit-lines
  29. C-> -> mc/mark-next-like-this
  30. C-< -> mc/mark-previous-like-this
  31. C-c C-< -> mc/mark-all-like-this
  32. C-7 -> switch-to-prev-buffer
  33. C-8 -> switch-to-next-buffer
  34. C-, -> hide/show-comments-toggle
  35. C-9 -> emacs-maximize
  36. C-x C-` -> save-buffers-kill-terminal
  37. C-0 -> hs-toggle-hiding)
  38. C-o -> hs-hide-level)
  39. C-' -> hs-all-toggle-hiding
  40. C-/ -> undo
  41. M-s -> projectile-ripgrep
  42. M-k -> helm-imenu-anywhere
  43. M-i -> helm-swoop
  44. C-M-i -> helm-swoop-mutil-all
  45. C-x g -> magit-status
  46. C-c a -> org-agenda
  47. C-c c -> org-capture
  48. C-c b -> org-iswitchb
  49. dired-ranger-mode
    1. c -> dired-ranger-copy
    2. l -> dired-ranger-move
    3. h -> dired-ranger-paste
    4. j -> dired-up-directory
    5. i -> dired-subtree-insert
    6. f -> dired-subtree-remove
  50. M-SPC-
    1. l -> goto-last-change
    2. r -> helm-recentf
    3. m -> newline-and-indent
    4. g -> goto-line
    5. 9 -> bookmark-set
    6. 7 -> bookmark-jump
    7. w -> er/mark-inside-pairs
    8. h -> highlight-symbol-at-point
    9. d -> highlight-symbol-at-point
    10. t -> shell-command
    11. q -> query-replace
    12. c -> helm-find-files
    13. p -> browse-url-at-point
    14. a -> beginning-of-buffer
    15. e -> end-of-buffer
    16. 1 -> delete-other-window
    17. 2 -> split-window-below
    18. 3 -> split-window-right
    19. z -> suspend-frame
    20. n -> new-frame
    21. u -> delete-frame
    22. o -> other-frame
    23. i -> shell
    24. j -> kill-ring-save
    25. ; -> c-mark-function
    26. 0 -> eval-buffer
    27. s -> read-only-mode
    28. ->
      1.

todo :todo:

DONE 更改avy-goto-char 支持 org-mode

通過(bind-key* "C-j" 'avy-goto-char),實現了

things in my life

1 身體健康

2 心理健康

3 生活

4 工作

5 個人興趣愛好

project feelings

做項目前要進行全面的考慮,進行實際的可行性分析,沒個7成以上的把握,不要做

必須要明確需求,非常明確,差之毫厘謬以千里啊

軟件程序要保證超好的可移植性,RTOS和app,bsp分層機制可以確保這一點

books 📚

專業嵌入式軟件 :pro_embedded_software:

  1. 為了避免大小端模式,所帶來的問題,軟件開發過程中指針應當嚴格按照所需的類型進行傳遞
  2. 邊界對齊是處理器為了提高處理性能而對存取數據的起始地址所提出的一種要求
    1. typedef struct {
      char a_;
      int b_;
      } type_t;
      邊界對齊 sizeof(type_t) = 8, 非邊界對齊 = 5
      邊界對齊 訪問b_只要一次存取操作,非邊界對齊 訪問b_要2次存取操作
    2. 網絡通信時,不希望因為字節對齊而傳送多余的字節,為了避免編譯器對齊處理,
      可以在結構之前加上 "#pragma pack(1)"
    3. 為了彌補硬件斷點數量的不足可以使用軟件斷點來替代
      軟件斷點,一般使用非法或無效的指令或軟件中斷指令SWI,產生異常
  3. 蛇形走線,是為了通過保證信號線的長度相同,從而減小相位差,保證信號更加完整
  4. 走線要考慮,避開周圍元器件的干擾
  5. 軟件開發中應對信號完整性問題的參考建議
    1. 懷疑信號完整性問題之前要保證軟件設計沒有錯誤
    2. 最好保證手邊有一塊大公司所提供的參考板卡。(硬件質量有保證)
    3. 處理器和外設芯片之間的信號線,工作頻率適中,夠用就好。軟件時序要做好
  6. makefile
    1. makefile中可以使用echo來進行調試,然后在echo前加上@就屏蔽了這個調試功能
    2. MAKECMDGOALS表示的是當前構建的目標名
    3. := -> 只展開一次, = -> 遞歸展開,?= -> 變量未定義時,就把右邊的值賦給他,如果已經定義不改變原值
    4. += 追加賦值
    5. override 指令可以防止變量被覆蓋
  7. 系統初始化順序–平台層,框架層,應用層–順序分配
  8. 系統終止化順序–應用層,框架層,平台層–逆序釋放
  9. 軟件開發特點
    1. 腦力密集型工作
    2. 實現不具唯一性
    3. 隱性成本高
    4. 忽視的細節容易被放大
    5. 質量難以評估
  10. 保證質量的關鍵要素
    1. 需求分析質量
      • 需求分析失誤所帶來的開發成本是高昂的
    2. 設計質量
      • 設計是軟件質量之本
    3. 編碼質量
    4. 驗證質量
  11. UML管理需求,UML輔助設計工作
  12. 設計文檔采用word格式,文檔中加入UML圖
  13. 編程習慣借鑒
    1. 盡量判斷失敗而非成功
    2. 采用sizeof減少內存操作失誤
    3. 屏蔽編程語言特性
    4. goto語句
      • 不濫用
      • 避免goto語句形成一個環,而要形成一條線
  14. 避免出現魔數,而以定義宏的形式來表示
  15. sizeof()會將字符串的結束符'\0'計算在內,strlen不會,但是sizeof()比strlen高效
    1. sizeof()的值在編譯時就決定了
  16. char temp= {0}; 會將temp數組的5個值統統置為0
  17. 減小上鎖的粒度,精確包含頭文件,不需要的頭文件要舍棄
  18. 不要在頭文件中包含其他的頭文件,盡量在.c源程序中包含他們
  19. 清除編譯器報告的所有警告

數據結構與算法 :c_structure:

大O時間

  1. 常用算法的時間復雜度所耗費的時間從小到大依次是:
    O(1) < O(logn) < O(n) < O(nlogn)< O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)

PMBOOK :項目管理:

c嵌入式編程設計模式 :設計模式:

設計模式是:對經常出現問題的通解

狀態機設計模式

狀態機:Moore機->輸出-狀態 Mealy機->輸出-狀態+輸入
四要素:現態、條件、動作、次態

  1. 狀態機程序設計

    1. 用一個函數或多個函數根據條件(時間同步或事件異步)來判斷狀態遷移
    2. 用一個函數來描述狀態對應的動作

嵌入式計算系統設計原理 :設計原理:

設計的一般步驟

  1. 搞清需求–輸出需求說明書
    需求文檔內容

    • 名稱
    • 目的
    • 輸入
    • 輸出
    • 功能
    • 性能
    • 生產成本
    • 功耗
    • 物理尺寸和重量

    需求的評價標准

    • 正確性
    • 無二義性
    • 完整性
    • 可檢驗性
    • 一致性
    • 可修改性
    • 可追蹤性
  2. 規格說明–輸出技術規格書
    需求的提煉,是可用來創建體系結構的關於系統的更詳盡、更精確、更一致的描述

    1. 制作概念性規格說明
      • 使用UML來描繪系統構件
    2. 詳細的規格說明
      • 對概念性規格進一步細化,也是用UML來描述
  3. 系統體系結構設計

    1. 小型系統
      硬件–原理圖和PCB
      軟件–程序設計
      結構設計(對於產品)
    2. 大型系統
      要繼續分工,增加文檔
  4. 系統集成

  5. 系統測試

  6. 產品–輸出產品說明書

  7. 維護和售后

嵌入式系統軟件設計常用算法 :設計算法:

常用線性方程組求解算法

  1. 主元消去法
    1. 無回代過程
    2. 有回代過程
  2. 行列式

常用代數插值和曲線擬合算法

  1. 線性插值
  2. 拋物線插值
  3. 曲線擬合

常用數值積分算法

常用能譜處理算法

  1. 譜曲線平滑
  2. 譜峰定位
  3. 能量刻度
  4. 峰面積計算
  5. 含量計算

常用數字濾波算法

  1. 程序判斷濾波
  2. 中值濾波
  3. 算術平均濾波
  4. 去極值平均濾波
  5. 滑動平均濾波
  6. 滑動加權濾波
  7. 一階滯后濾波

常用數理統計算法

  1. 數據樣品的正態分布
  2. 均值和均方差的估算
  3. 用數理統計方法消除粗大誤差
  4. 用數理統計方法計算線性相關系數

常用自動控制算法

  1. 簡單閾值控制
  2. 經典pid控制

常用數據排序算法

  1. 歸並排序
  2. 快速排序

常用數據壓縮算法

  1. 信源編碼
  2. 霍夫曼編碼
  3. 批量采樣數據的壓縮編碼

常用檢錯與糾錯算法

  1. 奇偶校驗
  2. 和校驗
  3. CRC校驗
  4. 漢明碼
  5. 檢二糾一
  6. 抗突發干擾措施

實時軟件設計

  1. 需求分析
    分析用戶需求,定義系統的各功能模塊,i/o及系統的性能指標
  2. 數據流分析
    進行數據流分析,設計出各功能模塊之間的數據流圖
  3. 分解任務
    在識別出並行性后,進行任務分解,將系統分解成主要的任務
  4. 定義任務間接口
    定義任務間,任務和中斷之間的同步通信和互斥關系
  5. 任務級設計
    按模塊方式設計任務,並定義模塊間的接口
  6. 模塊構築
    完成每一個模塊的詳細設計,編碼和單元測試
  7. 任務與系統集成
    逐個模塊連接,測試構成任務,逐個任務連接測試最終形成系統
  8. 系統測試
    測試整個系統或子系統,以驗證功能指標的實現,為具有更強的客觀性,系統測試最好
    由一個獨立的測試小組執行

DARTS方法

通過將系統分解成任務和定義任務接口的方法,來擴充結構化分析和設計的方法,使得實時應用
系統具有並行處理的能力。核心:將一個系統分解為並行的任務,並定義任務間的接口

  1. 如何划分任務
    系統內功能的異步性,再分析數據流的變換,確定哪些變換可以並行;一個變換是應該成為一個獨立的任務
    還是和其他變換一起組成一個任務
    后者由以下方面決定:i/o的依賴性,時間關鍵性,計算功能,功能聚合,周期和時間聚合
    1. i/o的依賴性
      如果變換依賴於i/o,那么它運行的速度常常受限於與它互操作的i/o設備的速度,此時
      變換應成為一個獨立的任務

      • 在系統中創建多個與i/o設備相當數目的i/o任務
      • i/o任務只實現與設備相關的代碼
      • i/o任務的執行只受限於i/o設備的速度,而不是處理器
      • 在任務中分離設備相關性
    2. 時間關鍵性

      • 將有時間關鍵性的功能分離出來,組成獨立運行的任務
      • 賦予這些任務高的優先級,以滿足對時間的需要
    3. 計算功能

      • 計算功能占用的cpu時間多
      • 捆綁計算功能成任務,賦予他們較低優先級運行,能被高優先級任務搶占,消耗cpu剩余的時間
      • 保持高優先級的任務是輕量級的
      • 多個計算任務可以安排相同的優先級,按時間片循環輪轉
    4. 功能內聚

      • 各緊密相關的功能不能對應不同的任務
      • 將這些緊密相關的功能組成一個任務,使各功能共享資源或作為相同事件的驅動程序
      • 組成一個任務會減少 任務通信的開銷,而且不僅保證了模塊級的功能內聚,
        也保證了任務級的的功能內聚
    5. 時間內聚

      • 將同一時間內完成的各功能,即使這些功能不是相關的,也要形成一個任務
      • 功能組的各功能是由相同的外部事件驅動的,這樣每次任務接收到一個事件,它們都可以同時執行
      • 組成一個任務可以減少系統開銷

      每個功能都作為一個獨立的模塊來實現,從而達到了模塊級的功能內聚,這些模塊組合在一起,
      又達到了任務級的時間內聚

    6. 周期和時間內聚

      • 將相同周期內執行的各功能組成一個任務
      • 頻率高的賦予高優先級

mastering embedded system :嵌入式:

main players

  1. the open source communit
  2. cpu archiects
  3. soc vendors
  4. board vendors and oems

project life cycle

  1. board bring-up
  2. system architecture and designs
  3. writing embedded applications
  4. debugging and optimizing performance

four elements of embedded linux

  1. toolchain

    1. GNU toolchain
      • Binutils
      • GNU Compiler Collection (GCC)
      • C library
        • application->c library->systemcall->kernel
        • glibc
          big but complete
        • musl libc
          It is a good choice for systems
          with a limited amount of RAM and storage. It has an MIT license
        • uclibc-ng
        • choose which
          uclinux->uclibc-ng; <32MB->musl libc, uclibc-ng; >32MB glibc
    2. type of toolchain
      • native
      • cross
    3. building the toolchain
      • crosstool-NG
        • ./ct-ng list-samples
        • ./ct-ng show-arm-cortex_a8-linux-gnueabi
  2. bootloader

    1. ROM code
      loading a small chunk of code from (nand flash, spi flash, sd card, emmc, or
      ethernet, usb, uart) into the sram
    2. SPL
      the small chunk of code, namely spl, the spl is used to set up the memory controller
      and something else of the system to loading the tpl into the DRAM.
      spl: ti x-loader atmel at91bootstrap xillinx fsbl
    3. tpl
      the tpl namely the u-boot for instance. TPL is used to load the kernel.
    4. parameters to be passed from u-boot to the kernel
      • machine number
      • basic details of the hardware such as cpu clock speed
      • the kernel command line
      • the location and size of a device tree binary
      • the location and size of initramfs
    5. device tree
      • old days the information passed over the platform-data
      • now days(from 2013 linux3.8) through the device tree
  3. kernel
    1.

  4. root filesystem(specific programs included)

  5. means of loading software

    1. jtag
    2. directly load the boot code from sd cards or rs-232 or usb

tools

  1. Flashbench

    to deduce the erase block size and page size of the chip or card.

unix環境高級編程

高級io

存儲映射IO

  1. mmap

    void *mmap(void *addr, size_t len, int prot, int flag, int filedes, off_t off)

    1. prot:PROT_NONE PROT_READ PROT_WRITE PROT_EXEC
      對指定映射存儲區的保護要求不能超過文件open模式訪問權限
    2. addr:0表示又系統選擇該映射的起始地址
    3. mmap的返回值為映射的起始地址
    4. flags:
      • MAP_FIXED:返回值必須等於addr,使用該標志不利於可移植性,不鼓勵使用此標志
      • MAP_SHARED: 該標志說明了本進程對映射區所進行的存儲操作的配置

IPC

管道,fifo,消息隊列,信號量,共享存儲器,socket

  1. 管道
    • 半雙工(有的系統是全雙工的)(socket沒有該局限性,命名流管道也沒有)
    • 只能在具有公共祖先的進程之間使用(FIFO沒有該局限性)(socket,命名流管道也沒有)

僵屍進程的處理

unix網絡編程

sprintf無法檢測緩沖區溢出,改用snprintf

gets,strcat,strcpy同樣應分別改為fgets,strncat,strncpy–strlcat,strlcpy

tcp的三次握手

  1. 客戶端發送syn帶有序列號
  2. 服務器返回一個ack,帶有的序列號的值為syn的序列號加1,同時也發送一個syn
  3. 客戶端收到后返回一個ack,同樣為收到的syn+1

treeos

treeos_io

  1. ds18b20 io0

error

esp32 gcc errors

  1. error: missing braces around initializer [-Werror=missing-braces]
    二維數組要用括號進行分組

st-lorawan

send

send–(LoRaMacMcpsRequest)

notices

當電腦無線網卡不能上網時,要將以太網卡設置為靜態IP

cmd_operations

生成補丁

diff -uprN ../stm32f407_freertos_test_iar ../../test_prj/stm32f407_freertos_test_iar > first.diff

打補丁

cd 未修改過的內核
patch -p1 < first.diff

hard_fault

外設硬件未初始化成功會造成該錯誤

數組越界同樣會經常性的造成這個錯誤

Footnotes:

1

DEFINITION NOT FOUND.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM