首页 > 其他 > 详细

平时工作学习记录

时间:2020-01-13 16:10:45      阅读:122      评论:0      收藏:0      [点我收藏+]

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

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. ->

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
  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.

平时工作学习记录

原文:https://www.cnblogs.com/e665107/p/12187742.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!