jtag和swd接口线序

下面为J-Link接口定义:

仿真器端口 连接目标板 备注
1. VCC MCU电源VCC VCC
2. VCC MCU电源VCC VCC
3. TRST TRST Test ReSeT/ pin
4. GND GND或悬空
5. TDI TDI Test Data In pin
6. GND GND或悬空
7. TMS, SWIO TMS, SWIO JTAG:Test Mode State pin ; SWD: Data I/O pin
8. GND GND或悬空
9. TCLK, SWCLK TMS, SWCLK JTAG: Test Clock pin ; SWD: Clock pin
10. GND GND或悬空
11. RTCK RTCK
12. GND GND或悬空
13. TDO TDO Test Data Out pin|
14. GND GND或悬空
15. RESET RESET RSTIN pin|
16. GND GND或悬空
17. NC NC
18. GND GND或悬空
19. NC NC
20. GND GND或悬空

下面是管脚物理排列:
jtagswd

基于docker/虚拟机的esp32远程工作流

工作流框图

背景说明

  1. 为什么需要这套工作流–为了满足高效和灵活的开发方式
    • 因为我经常需要在公司和家里切换不同的电脑工作,所以编译环境需要在远程主机上,这样不同的工作机器都能访问相同的工作编译环境。
    • 因为esp32官方推荐的还是在linux下编译,所以最简单的就是我们的编译环境和工具链还是在linux下。但是我们日常的编码和硬件烧录还是在本地windows和mac的居多。所以就有了这一套本地环境和远程docker环境相互配合的工作流。我们可以在远程编译环境使用命令行高效编译,本地继续使用VSC等工具编码和烧录。
  2. 为什么用docker而不是虚拟机?
    • 因为docker更轻量小巧,结合hub.docker.com 用起来也更方便些,更具有灵活性。当然如果你就是喜欢用VM,也是可以的,这个流程仍然适用,只是挂载宿主的目录方式有所不同而已。
    • 使用docker另外一个好处是,你可以很方便的将你配置的开发环境通过hub.docker.com分享给需要的人。

工作流步骤

  • 选择对应的linux系统镜像创建我们的docker镜像,这里我们推荐选择ubuntu 16.04系统。
  • 启动时,我们用 -v 参数将远程宿主机的本地目录挂载进docker系统。
  • 按照官方esp32的编译环境要求,部署相应的工具链和环境。部署到我们映射的目录中,这样相关的工具和代码等都可以在宿主机里面可见,并且可访问。
  • 将挂载的目录通过samba或者sshfs共享给远程的编码机器(window或者MAC)环境,并且挂载到本地虚拟磁盘路径上。
  • 日常的编码和烧录,我们就可以像访问本都路径一样访问远程vps的开发路径。使用VSC编码,或者download tool进行开发板烧录。

docker镜像

最后,如果你对使用docker环境开发esp32感兴趣,也可以直接使用我目前在用的针对esp32的docker开发镜像。一键部署,开箱即用。

docker pull hiproz/ubuntu-esp32

参考

esp32 ubuntu开发环境搭建
docker常用操作命令
windows下实现esp32下载
sshfs的安装

windows下实现esp32下载

  1. UI工具下载
    使用官方的UI工具 flash_download_tools 但是始终提示如下的错误:
wxBitmap::CreateFromImage(): invalid image

同时UI工具弹框提示:找不到 ./RESOURCE/IDLE_S.bmb
根据日志,对相关模组做了重新安装:

pip install -U wxPython
pip install Pillow

安装后还是不行,遂暂时另寻他法。
2. python命令行下载
想起ubuntu下 make flash 命令后的下载命令,一想,我可以在windows下如法炮制啊:

 ./esp32/esp-idf/components/esptool_py/esptool/esptool.py --chip esp32 --port COM15 --baud 115200 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size detect 0x1000 ./esp32/esp-proj/hello_world/build/bootloader/bootloader.bin 0x10000 ./esp32/esp-proj/hello_world/build/hello-world.bin 0x8000 ./esp32/esp-proj/hello_world/build/partitions_singleapp.bin

遇到问题:

No module named tools.list_ports

于是安装缺少的模块:

pip install pyserial --upgrade

再执行,同步重启设备,竟然顺利烧写成功了。
3. UI工具正常了
等方式2成功后,再尝试UI工具时,竟然顺利成功了。感情前面的失败是uart组件缺失导致的,日志提示真是坑啊。

最后还是一如既往的死磕,搞定!

sshfs的安装

windows环境

sshfs客户端和dokan版本要正确,否则可能报version error。下面是验证过的2个配套版本:
1. dokan
https://github.com/dokan-dev/dokany/releases/tag/v1.0.5
2. winsshfs
https://github.com/feo-cz/win-sshfs/releases

mac环境

mac使用的底层技术和window不一样:
1. 安装

brew install Caskroom/cask/osxfuse
brew install sshfs

安装完执行sshfs命令测试一下。
2. 运行

sshfs -C -o reconnect user@hostname:remote_dir local_dir

考虑到之前已经运行过,或者挂载过,每次运行时,都清除掉,重新运行,如果是设置了只允许证书登录,则使用-o ssh_command参数指定ssh的证书,参考命令如下:

pkill -9 sshfs
umount local_dir
sshfs -o ssh_command='ssh -i key' user@hostname:remote_dir  local_dir

windows下的端口映射

在某些情况下,我们要绕过一些失效的端口,就需要将一些默认的端口做端口映射。

端口映射,linux/unix中使用ssh命令,而windows中也有类似的命令netsh。客户端连接物理主机的“服务端口a”映射到“服务端口b”从而实现端口的变换。

命令如下

  • 可以查看存在的转发
    netsh interface portproxy show all

  • 添加一个IPV4到IPV4的端口映射
    netsh interface portproxy add v4tov4 listenport=22 connectaddress=ip connectport=port

  • 删除指定转发端口
    netsh interface portproxy delete v4tov4 listenport=port

例子

假定需要通过192.168.1.8的14941端口连接192.168.1.118的22端口,则需要在192.168.1.8主机的命令行输入如下语句
– 操作系统开启了主机防火墙,需要放行TCP 14941的入站连接
netsh interface portproxy add v4tov4 listenport=14941 connectaddress=192.168.1.118 connectport=22
– 取消上面配置的端口转发,可以用如下语句:
netsh interface portproxy delete v4tov4 listenport=14941
– 如果想查看已经配置了哪些端口转发,可以用如下语句:
netsh interface portproxy show v4tov4

更多命令,请查看帮助,都写得很清楚的。

wordpress用户页面按照修改时间显示文章

默认是按照发布时间来显示的,有时候我们希望按照修改时间来显示,最近修改的先显示。
修改方法如下:
在你的主题首页文件 index.php中类似以下代码之前:

while (have_posts()) : the_post();

添加:

$posts = query_posts($query_string . '&orderby=modified');

这样在首页的排序就已经达到效果啦,如果你其它页面也需要这样安装修改排序,那么同理即可,修改其它页面就行了。

esp32 ubuntu开发环境搭建

  1. 工具链准备
    gcc及python环境准备
sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-pyparsing
  1. 查看系统版本,安装相应的工具链包
cat /proc/version

64位下载:

wget https://dl.espressif.com/dl/xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz

解压
设置环境变量,目前发现docker中,只有.bashrc 中生效

export PATH="$HOME/esp/xtensa-esp32-elf/bin:$PATH"
  1. esp-idf 安装
git clone --recursive https://github.com/espressif/esp-idf.git

设置环境变量,目前发现docker中,只有.bashrc 中生效

export IDF_PATH=~/esp/esp-idf
  1. 安装依赖的 Python 软件包
python -m pip install --user -r $IDF_PATH/requirements.txt

docker软件安装

为了保持最精简的系统,默认的系统镜像是没有额外应用的,任何需要的应用几乎都要自己来安装。
默认docker使用的是宿主网卡,只可以直接访问外网的,如果访问外部网络有问题,请检查安装过程或者使用的镜像。

关于linux选用哪个系统好的问题,理论上hub.docker.com上各个官方的都差不多,哪个用的习惯就用那个。抛开具体的产品开发环境和团队系统要求,目前还是ubuntu的最多些。如果没有特殊要求,我们一般推荐ubuntu来做docker环境。

对于ubuntu新系统,第一步要 apt-get update,其他的系统同理。然后再安装其他需要的软件,否则可能提示找不到对应的包。

  1. ping
    apt-get install iputils-ping
    这个是必要的工具,方便来确认网络问题。

c语言变参的宏定义

#define debug(format, ...) fprintf(stderr, format, __VA_ARGS__)

等价于:

#define debug(format, args...) fprintf (stderr, format, args)

C99规范支持了可变参数的宏,可以用VA_ARGS传递…。
用法如下:

#include <stdio.h>

#define DEBUG(format, ...) printf(format, __VA_ARGS__)

int main(){
        int turn=1;

        printf("enter %s\n", __func__);
        DEBUG("test:%d\n",turn);
        return  0;
}

但这样又引入了一个新的问题,当…为空时,会导致链接错误。这里引入’##’操作。如果可变参数被忽略或为空,’##’操作将使预处理器(preprocessor)去除掉它前面的那个逗号。

#include <stdio.h>

#define DEBUG(format, ...) printf(format, ##__VA_ARGS__)

int main(){
        int turn=1;

        printf("enter %s\n", __func__);
        DEBUG("test:%d\n",turn);
        DEBUG("test\n");
        return  0;
}

参考:
宏中”#”和”##”的用法

docker常用操作命令

创建

可以在hub.docker.com上创建一个新的repo,或者自己复制一个现有的repo.
绑定github后,也可以直接通过Dockerfile来发生成最新的镜像

查看镜像列表

docker images

查看容器列表

docker ps

查看所有的容器

docerk ps -a

查看最近创建的容器

docker ps -l

查找在指定 image 之后创建的 image 中的父 image

docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image ls -q --filter since=xxxxxx)

获取镜像

docker pull name/reponame

删除

docker rm          Remove one or more containers
docker rmi         Remove one or more images

删除已经退出运行的容器

docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm

删除none镜像

docker images |grep none |awk '{print $3}'|xargs docker rmi

要删除全部image的话

docker rmi $(docker images -q)

停止所有容器

停止容器,才能删除所包含的image

docker stop $(docker ps -a -q)

运行

ssh登陆:

docker run -it  username/imagename /bin/bash

ssh登陆,并挂载本地目录,默认读写权限:

docker run -it -v 宿主绝对路径:docker绝对路径 username/imagename /bin/bash

attach

docker attach --sig-proxy=false $CONTAINER_ID

detach

docker没有专用的命令,目前不能使用eixit,因为会导致主进程退出。使用ctl+p+ctl+q来detach当前的进程

查看底层信息,比如IP等

docker inspect --format='{{.NetworkSettings.IPAddress}}' $CONTAINER_ID

commit

docker commit CONTAINER_ID docker_hub用户名/镜像名:tagname

push

docker push docker_hub用户名/镜像名:tagname

其他参考

资深专家都知道的 Docker 常用命令—源英文:Top Docker Commands Any Expert Should Know
Docker之容器的创建、启动、终止、删除、迁移等
docker入门——构建镜像

关于DEBIAN_FRONTEND noninteractive的正确用法

DEBIAN_FRONTEND这个环境变量,告知操作系统应该从哪儿获得用户输入。如果设置为”noninteractive”,你就可以直接运行命令,而无需向用户请求输入(所有操作都是非交互式的)。这在运行apt-get命令的时候格外有用,因为它会不停的提示用户进行到了哪步并且需要不断确认。非交互模式会选择默认的选项并以最快的速度完成构建。请确保只在Dockerfile中调用的RUN命令中设置了该选项,而不是使用ENV命令进行全局的设置。因为ENV命令在整个容器运行过程中都会生效,所以当你通过BASH和容器进行交互时,如果进行了全局设置那就会出问题。

正确的做法 – 只为这个命令设置ENV变量
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y python3

错误地做法 – 为接下来的任何命令都设置ENV变量,包括正在运行地容器

ENV DEBIAN_FRONTEND noninteractive
RUN apt-get install -y python3

我的示例如下:

FROM ubuntu:trusty
MAINTAINER mryqu 
RUN \
 DEBIAN_FRONTEND=noninteractive apt-get update && \
 DEBIAN_FRONTEND=noninteractive apt-get -y install wget curl && \
 DEBIAN_FRONTEND=noninteractive apt-get -y autoremove && \
 DEBIAN_FRONTEND=noninteractive apt-get clean

ameba sdk的debugger设置

  1. setup

    两个配置项的内容:
$PROJ_DIR$\..\..\..\component\soc\realtek\8195a\misc\iar_utility\common\preload.mac
$PROJ_DIR$\..\..\..\component\soc\realtek\8195a\misc\iar_utility\common\8195a.ddf
  1. download

    配置内容:
    $PROJ_DIR$\tmp.board
  2. extra options

    配置内容:
    --drv_vector_table_base=0x0
    此选项如果没有设置,会出现 __vector_table 问题

STM32Cube 扩展包开发 checklist

STMCube 包括:
– STM32CubeMX,一个图形化配置工具软件,可以生成c语言的配置代码。
– 一个详尽的STM32Cube MCU开发包,为每个STM32系列提供:

-- STM32Cube HAL,涵盖所有外设。
-- Low-layer APIs,提供一个轻量快速的面向专家的接口层,LL只包含部分外设。
-- 一系列中间件,例如RTOS,USB,TCP/IP和图形界面等。
-- 一系列应用和示例。

简介

STM32Cube MCU Package 运行在 cortex-M 处理器上。

质量规范

  1. 确保所有工具兼容,不能有error和warnings。
  2. 开发要符合 MISRA C 编码标准,并且要进行静态代码分析。

封装规范

  1. 本地的STM32Cube MCU 组件包不能修改。release note 不能删除,不用的文件也不能删除,源代码也不能被修改。
  2. release notes应该包含以下的内容:
    — 主要变更点
    — 变更的内容,包括新开发的组件和被引用的组件。
    — 工具链,编译器
    — 支持的设备或者开发板
    — 局限性说明
  3. 每一个组件都应该有release note
  4. 文件或者相关的软件都要版本管理,并且在文件头或者release note中添加修改日期。
  5. 要求license 说明。
  6. 新的BSP驱动应该添加在 \Drivers\下。如果要添加新的组件,应该添加在\drivers\BSP\Components下。
  7. 新的中间件应该添加在 \Middlewares\Third_Party目录下。
  8. 用户示例应该添加到\Projects\下 ,并且遵循以下归类:
    — examples: 只使用HAL和BSP的例子。
    — Applications:使用中间件的例子。
    — Demonstration:全部使用的例子。
  9. example目录组织如下:
    — \Inc for header files
    — \Src for source files
    — \ toolchain preconfigured project, all temporary files haveto be deleted
    — ApplicationN_Name.ioc: STM32CubeMX
    project file
    — .extSettings: STM32CubeMX project
    additional settings file (optional, if needed)
    — \Binary containing binary file, using thisnaming format “USER_BOARD_REF_ApplicationN_Nam
    e_VX.Y.Z.bin”
  10. 使用TMC32CubeMX生成的例子
  11. .ioc .mxproject 和.extSettings文件必须和readme.txt文件在同一级目录,都在示例工程的根目录下。
  12. ioc 文件遵循 ApplicationN_Name.ioc格式的命名格式。
  13. 媒体文件应该放在 \Utilities\Media目录下。
  14. readme文件包含了每一个资源的copyright、license,务必要添加。
  15. 所有的上位机PC软件必须放在 \uTILITIES\pc+Software 下。
  16. 要为每一个示例添加预配置的EWARM,MDK-ARM,SW4STM32工程文件
  17. 顶层目录命名应该符合规范:STM32CubeExpansion____VX.Y.Z
  18. 发布的bin或者lib必须遵循:
    — 包含对应的头文件
    — release note
    — lib如果跟编译器相关,要遵循命名规则:LibraryNameV_CMx_C_O.a

中间件规范

  1. RTOS工程必须包含 CMSIS-RTOS API
  2. 一个新的中间件应该和硬件或者平台无关,并且有相应的接口层支持。
  3. 中间件要有中间件接口文件,可供用户定制或者更新。

文档规范

  1. 新增的组件都要有相应的API文档
  2. 每一个示例都应该有详尽的注释,功能描述和硬件设置说明。

go安装或者版本升级

之前go还停留在1.5现在要升级到最新版。
go是通过环境变量来关联版本的,所以安装和升级其实是一个流程。
对于升级,直接删除或者重命名原来的目录,将新包解压到原来的位置就可以了。
对于安装,就是直接解压,然后配置环境变量,参看 mac下零基础学习go语言-2-开发环境的搭建

下载

golang 官方下载

安装

tar -C /usr/local -xzf go1.11.2.linux-amd64.tar.gz

结束

IAR的link配置

不像STVD有详实的UI界面来配置详细的link参数,IAR无法无法细致的展现这些参数,那么如何配置这些参数呢,比如section,内存起始等。

在我们创建IAR的工程时,会生成EWSTM8目录,在目录下面的icf文件,就是默认iar工程加载的配置文件。没有的话,也可以自己修改或者从其他工程拿模板来修改。