2019年9月

使用 stm32f4 调试uart 接收, 使用 空闲中断,dma 双缓冲模式,有以下几点需要注意的。

  1. 调试的时候断点不要打在 if (USART_GetITStatus(USART6, USART_IT_IDLE) != RESET) 这种语句上面,要打在 if 的代码块里面。mdk 调试的时候,会出现一些 bug,当在 if (USART_GetITStatus(USART6, USART_IT_IDLE) != RESET) 断点的时候,能够看到 idle 信号出现,但是只要向下执行,不管是单步还是怎样,下一步的时候 idle 标志位就会消失。导致进不了空闲中断处理语句。但是如果断点打在代码块里面,就能够正常进入了。

  2. 使用双缓冲的时候, DMA_DoubleBufferModeConfig, DMA_DoubleBufferModeCmd 需要放在 DMA_Cmd 前面,还有别忘了 开启 circular 模式。

  3. 接收的时候,已经接收的字节数,等于 buffersize - ndtr 的结果。

  4. 开启双缓冲的时候,可以不用 disable dma,只需要在 空闲中断里面,识别出 ndtr 和 ct,然后经过计算得出本次传送的数据个数,并把本次开始的地址和数据个数记录下来,就可以由非中断部分程序来读取这一帧接收的数据。

位置无关码

bl 是位置无关码,指令中带的数值是,编译的时候,编译器计算好的,需要跳转的位置减去 bl 指令所在位置的结果。这样当程序最开始在 4k sram 中运行的时候,跳转的位置是在 0 + offset 的位置,当后期sdram 初始化好了之后,程序移动到 sdram 中运行的时候,跳转的位置是 0x30000000 + offset 的位置。

ldr 是位置相关码,指令中的位置是编译好的绝对位置,如果 sdram 中还没有初始化好,跳转的位置是 0x30000000地址以上的值,那就出错了。

如果是 C 语言,想要某些位置无关,那么就不能用全局变量和静态变量。

长距离跳转

b 和 bl 只能前后跳转 32M的范围,想要长距离跳转需要用 ldr pc, =main 这种方式来做。一般从sram 跳转到 sdram 中执行的时候,可以用 ldr 的指令来跳转。 bl 默认lr 是下一条指令,可以直接作为子函数的调用。ldr 只是单纯的跳转,用于调用子函数的时候,必须前面先用一条 ldr lr, =int_return 之类的语句作为返回用的 lr 位置。

链接脚本地址

编译器根据链接脚本中的地址来确定程序中各个部分的地址。链接脚本允许设定一部分放到 0地址开始的地方,一部分放到 0x30000000开始的地方,也可以都放到 0地址开始的地方,或者都放到 0x30000000 开始的地方。这里有好几个需要注意的地方:

  1. 从0地址开始的地方不能超过 4k sram 的大小。
  2. 正常使用 0x30000000 部分内容之前,必须初始化 sdram,才能正常使用。不然一些函数的跳转,全局变量等等都会引发出错。
  3. 如果是使用 0x30000000 部分的代码,并且还没来得及初始化 sdram,就需要跳转或者子函数,那么一定要使用位置无关码进行跳转,否则也会出错。

位置无关配置寄存器

本来可以把配置放到数组里面,然后用 for 循环给寄存器复制。但是如果想用位置无关代码的话,那么最好一个一个直接对寄存器赋值数值。这两种汇编出来后反编译是不一样的。直接赋值,汇编里面是一句句不太一样的数值进行加加减减,最后出来想要的数据并赋值。而使用数组,想要的数值是写死在函数中一小块位置上,数值比较清晰。

issues/679

create new UUID

cat /proc/sys/kernel/random/uuid

example config : multi port , multi user

vim /etc/v2???/config.json

{
  "inbounds": [{
    "port": 1234,
    "protocol": "vmess",
    "settings": {
      "clients": [
        {
          "id": "UUID",
          "level": 1,
          "alterId": 64
        },
        {
          "id": "UUID",
          "level": 1,
          "alterId": 64
        }
      ]
    }
  },
 {
    "port": 1235,
    "protocol": "vmess",
    "settings": {
      "clients": [
        {
          "id": "UUID",
          "level": 1,
          "alterId": 64
        },
        {
          "id": "UUID",
          "level": 1,
          "alterId": 64
        }
      ]
    }
  }],
  "outbounds": [{
    "protocol": "freedom",
    "settings": {}
  },{
    "protocol": "blackhole",
    "settings": {},
    "tag": "blocked"
  }],
  "routing": {
    "rules": [
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "blocked"
      }
    ]
  }
}

最后

v2??? restart 

重启 v2 的服务即可。

按照韦东山的视频中 sdram的裸机代码,写了一份,通过 minitools 下载到 0x30000000,然后烧录到 nand中,接过不能正常运行。 尝试过多种方法后,只有一种解决方法,就是不要用 0x30000000这个地址。 可以把 makefile 中的地址改为0x30008000,minitools 中下载的地址也改为 0x30008000,这样就可以正常的运行了。 可能 0x30000000 前面的一些内存被使用了?

后来换了一个 TQ2440的开发板,不使用 minitools,而是用 DNW配合bootload下载程序到nand,程序链接地址选择 0x30000000 是可以运行的。使用 DNW 驱动使用 韦东山的 zadig程序,安装 libusb-win32 驱动,然后使用 dnw_100ask.exe 来下载程序。

所以初步怀疑,这个现象可能和 minitools 软件相关。

汇编指令中 bne label 这条指令有以下两种特别的写法:bne 1b, bne 1f.

bne 1b 指的是 backward,倒退寻找标号为 1 的地方并跳转。

同样也有 bne 1f,值得是 forward,向前寻找标号为1的地方并跳转。

最近使用 mdk526,编辑设置使用 utf-8,编辑窗口中文正常,但是编译的时候提示 warning: #870-D: invalid multibyte character sequence,解决的方法很简单,在编辑选项 misc 里面填写 --no_multibyte_chars 或者 locale=english,都可以顺利编译。

但是编译完成之后还有一个烦心的事情,市面上很多串口工具的中文都是 gbk 编码的,不能识别 utf-8 的串口中文,需要专门找支持的串口工具。

找来找去,找到一个 teraterm-4.97.exe,这个是支持中文的,只需要如下修改即可。

Setup->Terminal
locale: chinese
CodePage: 936

关闭迅雷极速版升级提示 Step 1: 退出迅雷极速版,进入迅雷安装目录下的 Data 目录,删除 ThunderPush 文件夹。 Step 2: 在 Data 目录下新建一个文本文件,并命名为 ThunderPush,删除后缀名 .txt。(需要勾选显示 “文件的扩展名”)

Step 3: 右键 ThunderPush 文件 -> 属性,勾选 “只读”;安全 -> 编辑 -> 完全控制勾选 “拒绝”,应用。

完成!再打开迅雷极速版应该就不会弹出升级提示弹窗了。o( ̄▽ ̄)d 关闭迅雷自启服务 如果查看任务管理器的话,我们会发现,开机后无论迅雷是否运行,都会自动启动 ThunderPlatform.exe 进程和 XLServicePlatform 服务。

如果在使用迅雷的话,运行两个程序没啥问题。但你说咱们没打开迅雷,它默默地在后台跑这两个程序占用资源干什么呢…… 打开记事本输入下面代码,保存为 killxltask.bat,然后放入 [C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup] 开机自启文件夹中。 net stop XLServicePlatform taskkill /F /im ThunderPlatform.exe 开机后会自动运行该脚本,清除这两个程序。

或者把文件夹里有个“OnlineInstall.exe”的文件删除掉,简历一个假的并禁止访问应该也可以。

今天在 写了个简单的 led 的汇编程序,下载到 mini2440 的 nand flash 里面可以正常运行,但是下载到 sdram 里面不能运行。

后来发现有几个注意点,

  1. 要在 sdram 中运行,链接脚本的地址不能像 nand 里面一样是0,必须是 sdram 里面的地址,比如说 0x30000000.
  2. 下载到 ram 中的地址必须和 链接脚本的地址一致。
  3. 0x30000000 这个地址不行,0x30008000 这个地址肯定没有问题,0x30000020 超过这个地址,也都可以运行,0x3000001c 这个地址不能运行,但是 minitools 会断掉链接后自动链接上,其他小于 0x30000020 的地址,都是没有运行反应的。

具体是什么原因,还要后续进一步的调试了。

但是也不是每个程序都能在 sdram 中运行,具体情况暂时还不清楚,尽量还是烧录到 nand 中在运行,不容易出问题。