Mustache语法

“Mustache语法” Mustache是一个logic-less (轻逻辑) 模板解析引擎, 它是为了使用户界面与业务数据 (内容) 分离而产生的, 它可以生成特定格式的文档,通常是标准的HTML文档。 比如小程序的wxml中的代码 {{userInfo.nickName}},这里的{{ }}就是Mustache的语法。 Mustache的模板语法很简单,就那么几个 {{keyName}} {{{keyName}}} {{#keyName}} {{/keyName}} {{^keyName}} {{/keyName}} {{.}} {{!comments}} {{>partials}}

1 min · 21 words · -

Legendary

“Legendary” https://github.com/derrod/legendary https://github.com/doitsujin/dxvk/wiki/Common-issues legendary auth legendary list-games legendary launch Kinglet legendary list-installed –check-updates legendary launch Kinglet

1 min · 16 words · -

jwt spring security

“jwt spring security” POST http://localhost:9333/api/users/sign-up content-type: application/json {“userName”:“123456”,“fullName”:“shuangkou”,“password”:“123456”} https://example.com/comments/1 POST https://example.com/comments HTTP/1.1 content-type: application/json { “name”: “sample”, “time”: “Wed, 21 Oct 2015 18:27:50 GMT” } https://www.jianshu.com/p/0c54788c94f3 https://github.com/Snailclimb/spring-security-jwt-guide

1 min · 27 words · -

JTAG

“JTAG” JTAG JTAG (Joint Test Action Group,联合测试行动小组) 是一种国际标准测试协议,主要用于芯片内部测试。现在多数的高级器件都支持JTAG协议,如ARM、DSP、FPGA器件等。标准的JTAG接口是4线: TMS、 TCK、TDI、TDO,分别为模式选择、时钟、数据输入和数据输出线。 JTAG最初是用来对芯片进行测试的,基本原理是在器件内部定义一个TAP (Test Access Port,测试访问口) ,通过专用的JTAG测试工具对进行内部节点进行测试。JTAG测试允许多个器件通过JTAG接口串联在一起,形成一个JTAG链,能实现对各个器件分别测试。现在,JTAG接口还常用于实现在线编程 (ISP,In-System Programmable) ,对FLASH等器件进行编程。 JTAG编程方式是在线编程,传统生产流程中先对芯片进行预编程实现再装到板上因此而改变,简化的流程为先固定器件到电路板上,再用JTAG编程,从而大大加快工程进度。JTAG接口可对PSD芯片内部的所有部件进行编程。 简单地说,JTAG的工作原理可以归结为: 在器件内部定义一个TAP (TestAccessPort,测试访问口) ,通过专用的JTAG测试工具对内部节点进行测试和调试。 边界扫描 边界扫描 (Boundary-Scan) 即在芯片的每个输入输出管脚上都增加一个移位寄存器单元 (Boundary-Scan Register Cell) ,因为这些移位寄存器单元分布在芯片的边界上,所以被称为边界扫描寄存器。在JTAG 调试中,边界扫描是一个很重要的概念,当需要调试芯片时,这些寄存器将芯片与外围电路隔离,实现对芯片输入输出信号的观察和控制: 对于输入管脚,可以通过与之相连的边界扫描寄存器单元把数据加载到该管脚中;对于输出管脚,可以通过与之相连的边界扫描寄存器"捕获" (CAPTURE) 该管脚上的输出信号;正常运行状态下,这些边界扫描寄存器单元对芯片是透明的,所以正常的运行不会受到影响。另外,芯片输入输出管脚上的边界扫描 (移位) 寄存器单元可以相互连接起来,在芯片的周围形成一个边界扫描链 (Boundary-Scan Chain) ,它可以串行的输入和输出,通过相应的时钟信号和控制信号,实现对处在调试状态下的芯片的输入和输出状态的观察和控制。 在CPU外围,处理器内部包含了JTAG的硬件实现,并且向外界提供接口,也就是上面所说的TMS、TCK、TDI、TDO四个引脚。 这里的CPU: 是指运算处理单元,只包含了内部寄存器以及运算单元等基本部件。 这里的处理器: 是指CPU 扩展芯片,不是SoC。 说明: 更多关于CPU和处理器之间的关系,请参考文章《CPU MPU MCU SOC SOPC关系及区别》。 JTAG原理 边界扫描链 JTAG如何用于芯片测试呢?其中用到的最主要部件就是边界扫描链。命名为边界扫描链,是由于它位置处于处理器的边界上。 我们知道CPU是通过引脚与外围交流的,所有的数据都会通过引脚输入或者输出,而JTAG就是通过监控引脚的信号达到芯片测试的目的。而边界扫描链就是在引脚上的一个部件。如下图: 边界扫描链位置 边界扫描链位置 通过边界扫描链,当有信号输入的时候,边界扫描链就能获取信号,当CPU要输出信号的时候,边界扫描链也能获取要输出的信号。另外,也可以通过边界扫描链来直接向外部输出信号。 无论是信号的抓取还是输出,都需要有接口来保存这些信号,TDI 跟 TDO 就是做这样一些工作的。如图: JTAG TDI TDO示意图 JTAG TDI TDO示意图 本来边界扫描链保存着引脚上的信号,当通过TDI引脚输入我们自己的信号的时候,会发生沿上面红线方向的移位操作, ...

1 min · 142 words · -

jdk16

jdk16 新语言特性 JEP 394,适用于 instanceof 的模式匹配 模式匹配 (Pattern Matching) 最早在 Java 14 中作为预览特性引入,在 Java 15 中还是预览特性。模式匹配通过对 instacneof 运算符进行模式匹配来增强 Java 语言。 模式匹配使程序中的通用逻辑 (即从对象中有条件地提取组件) 得以更简洁、更安全地表示。 wiloon.com/jdk14 JEP 395,记录 记录 (Records) 在 Java 14 和 Java 15 中作为预览特性引入。它提供了一种紧凑的语法来声明类,这些类是浅层不可变数据的透明持有者。这将大大简化这些类,并提高代码的可读性和可维护性。

1 min · 35 words · -

jdk14

jdk14 instanceof 模式匹配 JDK 14的新特性:instanceof模式匹配 JDK14在2020年的3月正式发布了。可惜的是正式特性只包含了最新的Switch表达式,而Records,patterns,text blocks仍然是预览特性。 本文要讲的就是JDK14的一个预览特性instanceof的pattern matching。 也就是说在instanceof中可以使用模式匹配了。 怎么理解呢? 我们先举个历史版本中使用instanceof的例子。 假如我们是动物园的管理员,动物园里面有Girraffe和Hippo两种动物。 @Data public class Girraffe { private String name; } @Data public class Hippo { private String name; } public class TestZoo { private final static Logger logger = LoggerFactory.getLogger(TestZoo.class); public static void main(String[] args) { Girraffe g = new Girraffe(); g.setName("gg"); testZooOld(g); testZooNew(g); Cat c = new Cat(); c.setName("pipi"); testZooOld(c); testZooNew(c); } public static void testZooOld(Object animal) { if (animal instanceof Girraffe) { Girraffe girraffe = (Girraffe) animal; logger.info("girraffe name is {}", girraffe.getName()); } else if (animal instanceof Hippo) { Hippo hippo = (Hippo) animal; logger.info("hippo name is {}", hippo.getName()); }else{ logger.info("test zoo old, 对不起,该动物不是地球上的生物!"); } } public static void testZooNew(Object animal){ if(animal instanceof Girraffe girraffe){ logger.info("name is {}",girraffe.getName()); }else if(animal instanceof Hippo hippo){ logger.info("name is {}",hippo.getName()); }else{ logger.info("test zoo new, 对不起,该动物不是地球上的生物!"); } } } ...

1 min · 143 words · -

java 替换 ascii 不可见字符, StringEscapeUtils.escapeJava

“java 替换ascii不可见字符, StringEscapeUtils.escapeJava” StringEscapeUtils.escapeJava StringEscapeUtils.escapeJava String.replaceAll 替换成? my_string.replaceAll("\\p{C}", "?"); https://stackoverflow.com/questions/6198986/how-can-i-replace-non-printable-unicode-characters-in-java StringEscapeUtils 在java.commons.lang3的包中有许多方便好用的工具类,类似于处理字符串的StringUtils,处理日期的DateUtils等等,StringEscapeUtils也是其中的一员。 StringEscapeUtils是在java.commons.lang3的2.0版本中加入的工具类,在3.6版本中被标注为@deprecated,表明在之后的版本中则为过时状态,之后StringEscapeUtils类被移到java.commons.text包下。 功能用途 StringEscapeUtils的主要功能就是为Java,Java Script,Html,XML进行转义与反转义。 escapeJava(String input) / unescapeJava(String unionCodeString) 将输入字符串转为unicode编码 / 将unicode字符串转为Utf-8格式的字符串 escapeHtml4(String input) / unescapeHtml4(String input) 转义/反转义html脚本 escapeEcmaScript(String input) / unescapeEcmaScript(String input) 转义/反转义js脚本 escapeXml(String input) / unescapeXml(String input) 转义/反转义xml脚本 除了列出的几个较常用的方法,还有escapeJson(String input) / unescapeJson(String input)、escapeCsv(String input) / unescapeCsv(String input)等等,可以看一下下面的执行例子,有个直观的认识。 import org.apache.commons.text.StringEscapeUtils; import org.junit.Test; /** * @author liuqian * @date 2018/4/3 16:27 */ public class EscapeTest { @Test public void escapeTest() { System.out.println("转义/反转义Java字符串"); String javaString = "这是Java字符串"; System.out.println(StringEscapeUtils.escapeJava(javaString)); System.out.println(StringEscapeUtils.unescapeJava(StringEscapeUtils.escapeJava(javaString))); System.out.println("-------------------------------------------------------------"); System.out.println("转义/反转义Json字符串"); String jsonString = "{\"keyword\": \"这是Json字符串\"}"; System.out.println(StringEscapeUtils.escapeJson(jsonString)); System.out.println(StringEscapeUtils.unescapeJson(StringEscapeUtils.escapeJson(jsonString))); System.out.println("-------------------------------------------------------------"); //除了html4还有html3等格式 System.out.println("转义/反转义Html字符串"); String htmlString = "加粗字符"; System.out.println(StringEscapeUtils.escapeHtml4(htmlString)); System.out.println(StringEscapeUtils.unescapeHtml4(StringEscapeUtils.escapeHtml4(htmlString))); System.out.println("-------------------------------------------------------------"); //除了xml10还有xml11等格式 System.out.println("转义/反转义xml字符串"); String xmlString = "<xml>\"xml字符串\"</xml>"; System.out.println(StringEscapeUtils.escapeXml10(xmlString)); System.out.println(StringEscapeUtils.unescapeXml(StringEscapeUtils.escapeXml10(xmlString))); System.out.println("-------------------------------------------------------------"); System.out.println("转义/反转义csv字符串"); String csvString = "1997,Ford,E350,\"Super, luxurious truck\""; System.out.println(StringEscapeUtils.escapeCsv(csvString)); System.out.println(StringEscapeUtils.unescapeCsv(StringEscapeUtils.escapeCsv(csvString))); System.out.println("-------------------------------------------------------------"); System.out.println("转义/反转义Java Script字符串"); String jsString = "<script>alert('1111')</script>"; System.out.println(StringEscapeUtils.escapeEcmaScript(jsString)); System.out.println(StringEscapeUtils.unescapeEcmaScript(StringEscapeUtils.escapeEcmaScript(jsString))); } } 结果 转义/反转义Java字符串 \u8FD9\u662FJava\u5B57\u7B26\u4E32 这是Java字符串 ------------------------------------------------------------- 转义/反转义Json字符串 {\"keyword\": \"\u8FD9\u662FJson\u5B57\u7B26\u4E32\"} {\"keyword\": \"这是Json字符串\"} ------------------------------------------------------------- 转义/反转义Html字符串 <strong>加粗字符</strong> 加粗字符 ------------------------------------------------------------- 转义/反转义xml字符串 <xml>&quot;xml字符串&quot;</xml> <xml>"xml字符串"</xml> ------------------------------------------------------------- 转义/反转义csv字符串 "1997,Ford,E350,""Super, luxurious truck""" 1997,Ford,E350,"Super, luxurious truck" ------------------------------------------------------------- 转义/反转义Java Script字符串 <script>alert(\'1111\')<\/script> <script>alert('1111')</script> https://github.com/lq920320/blogs/issues/9 ...

1 min · 160 words · -

java coroutine

“java coroutine” Kotlin https://github.com/puniverse/quasar https://github.com/offbynull/coroutines https://github.com/kilim/kilim

1 min · 6 words · -

Infinitive 不定式

Infinitive 不定式 动词不定式一般是由“to + 动词原形”构成,还需要注意得是,这里的 to 是动词不定式的一部分,不做介词使用。举几个动词不定式的例子: to be to have to hold to sleep to spend 一定要注意的是,动词不定式中词尾从不以-ed或-ing结尾。动词不定式是动词的三种类型之一,具有动词、形容词、名词或副词的特征。在句子中通常可以作主语、宾语、补语、表语、定语、状语等。 https://liulingo.com/infinitive-yong-fa-he-li-zi

1 min · 19 words · -

icebox

“icebox” 先用adb安装 谷歌版冰箱激活 Root方法: 把冰箱apk放到 /data/local/tmp/ 文件夹中,然后为方便起见重命名为icebox.apk 然后打开终端,su后输入 pm install -i “com.android.vending” -r /data/local/tmp/icebox.apk 搞定[受虐滑稽] adb方法: 手机接上电脑, 执行 adb push [冰箱apk位置] /data/local/tmp/icebox.apk adb shell pm install -i “com.android.vending” -r /data/local/tmp/icebox.apk adb shell rm /data/local/tmp/icebox.apk 同样搞定[受虐滑稽][受虐滑稽] 然后你就可以连上谷歌验证购买了 参考: https://medium.com/@pixplicity/setting-the-install-vendor-of-an-app-7d7deacb01ee 冰箱免 Root (设备管理员模式) 手动配置 https://github.com/heruoxin/Ice-Box-Docs/blob/master/Device%20Owner%20%EF%BC%88%E5%85%8D%20root%EF%BC%89%E6%A8%A1%E5%BC%8F%E8%AE%BE%E7%BD%AE.md adb shell dpm set-device-owner com.catchingnow.icebox/.receiver.DPMReceiver

1 min · 48 words · -

hugo, envoy, github actions

“hugo, envoy, github actions” install sudo pacman -S hugo hugo new site quickstart cd quickstart git init git submodule add https://github.com/theNewDynamic/gohugo-theme-ananke.git themes/ananke echo theme = \"ananke\" >> config.toml hugo new posts/my-first-post.md hugo server -D hugo new site wiloon.com cd wiloon.com git init git clone https://github.com/olOwOlo/hugo-theme-even themes/even cp themes/even/exampleSite/config.toml config.toml hugo new post/my-first-post.md hugo server -D hugo pages, nginx server simple podman run -d \ --name hugo \ -p 30080:80 \ -v /home/blog/public:/usr/share/nginx/html \ -v /etc/localtime:/etc/localtime \ nginx:alpine hugo pages, nginx server podman run -d \ --name hugo \ --ip=10.88.0.10 \ -v /home/blog/public:/usr/share/nginx/html \ -v /etc/localtime:/etc/localtime \ nginx:alpine hugo-envoy podman run -d \ --name hugo-envoy \ -v /opt/hugo/service-envoy.yaml:/etc/envoy/envoy.yaml \ -v /etc/localtime:/etc/localtime \ --net=container:hugo \ envoyproxy/envoy-alpine:v1.14.1 front-envoy podman run -d \ --name front-envoy \ --add-host=hugo:10.88.0.10 \ -v /opt/hugo/front-envoy.yaml:/etc/envoy/envoy.yaml \ -v /etc/localtime:/etc/localtime \ -v /root/.acme.sh/yangcs.net:/root/.acme.sh/yangcs.net \ --net host \ envoyproxy/envoy-alpine:v1.14.1 https://blog.humblepg.com/post/2020/02/log-hugo-github-actions.html ...

2 min · 328 words · -

golang的类型转换, 强转、断言、“向上造型“

“golang 的类型转换, 强转、断言、“向上造型“” Golang的类型转换-三种转型(强转、断言、“向上造型“) 无数_mirage 2021-02-04 16:05:12 216 收藏 文章标签: golang go 接口 版权 golang没有类似于java中的隐式类型转换 golang中的类型转换分为强制类型转换、类型断言、以及“向上造型” 向上造型这个词是取的Java中的定义,没有复杂的含义,表示将子类转为父类。在golang中达到同样的目的只需要.父结构体即可 package main import “fmt” // 隐式类型转换和强转 func t1(){ var a float32 = 5.6 var b int = 10 //fmt.Println (a * b) // – 隐式类型转换,编译报错,不支持 fmt.Println(a * float32(b)) // – 强转 } type Base interface { hello() } type P interface { hi() } type S1 struct { } func (s1 *S1) hi() { fmt.Println(“s1-hi”) } func (s1 *S1) hello() { fmt.Println(“s1-hello”) } type S2 struct { } ...

1 min · 176 words · -

golang sync.Map

“golang sync.Map” func main() { m := sync.Map{} m.Store(1,1) go do(m) go do(m) time.Sleep(1*time.Second) fmt.Println(m.Load(1)) } func do (m sync.Map) { i := 0 for i < 10000 { m.Store(1,1) i++ } } 清空 sync.Map https://stackoverflow.com/questions/49355345/how-to-clean-a-sync-map //erase map: A zero sync.Map is empty and ready for use. map2 = sync.Map{} 在Go 1.6 之前, 内置的 map 类型是部分 goroutine 安全的, 并发的读没有问题, 并发的写可能有问题。自 go 1.6之后, 并发地读写 map 会报错, 这在一些知名的开源库中都存在这个问题, 所以go 1.9之前的解决方案是额外绑定一个锁, 封装成一个新的struct或者单独使用锁都可以。 本文带你深入到sync.Map的具体实现中,看看为了增加一个功能,代码是如何变的复杂的,以及作者在实现sync.Map的一些思想。 有并发问题的map 官方的faq 已经提到内建的map不是线程(goroutine)安全的。 首先,让我们看一段并发读写的代码,下列程序中一个goroutine 一直读,一个goroutine 一只写同一个键值, 即即使读写的键不相同, 而且map 也没有"扩容"等操作, 代码还是会报错。 | — | — | | 12345678910111213141516171819 | package mainfunc main() { m := make(map[int]int) go func() { for { _ = m[1] } }() go func() { for { m[2] = 2 } }() select {}} | ...

5 min · 908 words · -

github action

“github action” Deploy to vm - name: Deploy to vm uses: easingthemes/ssh-deploy@v2.1.2 env: SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} ARGS: "-avz --delete" SOURCE: "public/" REMOTE_HOST: "192.168.0.xxx" REMOTE_PORT: 38785 REMOTE_USER: "blog" TARGET: "/home/blog/public/" secrets.SSH_PRIVATE_KEY 粘贴私钥时后面加一个换行,否则会报错,invalid format

1 min · 33 words · -

flutter

“flutter” install yay -S flutter flutter doctor https://flutter.dev/docs/get-started/install/linux https://storage.googleapis.com/flutter_infra/releases/stable/linux/flutter_linux_2.0.5-stable.tar.xz export export FLUTTER_STORAGE_BASE_URL=“https://mirrors.tuna.tsinghua.edu.cn/flutter" export PUB_HOSTED_URL=“https://mirrors.tuna.tsinghua.edu.cn/dart-pub"

1 min · 14 words · -

etcd basic

“etcd basic” 单节点的etcd podman run -d \ -p 2379:2379 \ -v etcd-data:/etcd-data \ --add-host=localhost:127.0.0.1 \ -e ETCD_DATA_DIR="/etcd-data" \ -e ETCD_ENABLE_V2="true" \ -e ALLOW_NONE_AUTHENTICATION="yes" \ -e ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379" \ -e ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" \ --name etcd bitnami/etcd:latest set, get etcdctl ls etcdctl set /testdir/testkey "foo" etcdctl get /testdir/testkey etcdctl update /testdir/testkey "Hello" etcdctl rm /testdir/testkey etcdctl mk /testdir/testkey "Hello world" etcdctl mkdir testdir2 https://etcd.io/docs/v3.4.0/op-guide/container/ https://github.com/etcd-io/etcd/blob/master/Documentation/op-guide/container.md

1 min · 61 words · -

etcd

“etcd” etcd etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法, etcd基于Go语言实现。 本文的主角是 etcd。名称 “etcd” 源自两个想法,即 unix “/etc” 文件夹 和 “d” 分布式系统。“/etc” 文件夹是用于存储单个系统的配置数据的位置,而 etcd 用于存储大规模分布式的配置信息。因此,分配了 “d” 的 “/etc” 就是 “etcd”。 etcd 被设计为大型分布式系统的通用基板。这些大型系统需要避免裂脑操作,并且愿意牺牲可用性来实现此目的。 etcd 以一致且容错的方式存储元数据。 etcd 集群旨在提供具有稳定性、可靠性、可伸缩性和性能的键值存储。 分布式系统将 etcd 用作配置管理、服务发现和协调分布式工作的一致键值存储组件。许多组织在生产系统上使用 etcd,例如容器调度程序、 服务发现服务和分布式数据存储。使用 etcd 的常见分布式模式包括领导者选举、分布式锁和监视机器活动状态等。 此外,etcd 开箱即用地支持多种语言和框架。Zookeeper 拥有自己的自定义Jute RPC 协议,该协议对于 Zookeeper 而言是完全唯一的,并限制了其受支持的语言绑定,而 etcd 的客户端协议则是基于 gRPC 构建的,gRP 是一种流行的 RPC 框架,具有 go,C ++,Java 等语言支持。同样,gRPC 可以通过 HTTP 序列化为 JSON,因此即使是通用命令行实用程序 (例如curl) 也可以与之通信。由于系统可以从多种选择中进行选择,因此它们是基于具有本机工具的 etcd 构建的,而不是基于一组固定的技术围绕 etcd 构建的。 在考虑功能,支持和稳定性时,etcd 相比于 Zookeeper,更加适合用作一致性的键值存储的组件。 etcd的特点 简单: 安装配置简单,而且提供了HTTP API进行交互,使用也很简单 安全: 支持SSL证书验证 快速: 根据官方提供的benchmark数据,单实例支持每秒2k+读操作 可靠: 采用raft算法,实现分布式系统数据的可用性和一致性 概念术语 Raft: etcd 所采用的保证分布式系统强一致性的算法。 Node: 一个Raft状态机实例。 Member: 一个etcd实例。它管理着一个Node,并且可以为客户端请求提供服务。 Cluster: 由多个Member构成可以协同工作的etcd集群。 Peer: 对同一个etcd集群中另外一个Member的称呼。 Client: 向etcd集群发送HTTP请求的客户端。 WAL: 预写式日志,etcd用于持久化存储的日志格式。 snapshot: etcd防止WAL文件过多而设置的快照,存储etcd数据状态。 Proxy: etcd的一种模式,为etcd集群提供反向代理服务。 Leader: Raft算法中通过竞选而产生的处理所有数据提交的节点。 Follower: 竞选失败的节点作为Raft中的从属节点,为算法提供强一致性保证。 Candidate: 当Follower超过一定时间接收不到Leader的心跳时转变为Candidate开始竞选。 Term: 某个节点成为Leader到下一次竞选时间,称为一个Term。 Index: 数据项编号。Raft中通过Term和Index来定位数据。 数据读写顺序 为了保证数据的强一致性,etcd集群中所有的数据流向都是一个方向,从 Leader (主节点) 流向 Follower,也就是所有 Follower 的数据必须与 Leader 保持一致,如果不一致会被覆盖。 ...

2 min · 337 words · -

esp,ebp,栈指针,帧指针

“esp,ebp,栈指针,帧指针” (1) ESP: 栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。 (2) EBP: 基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。 栈帧每一个都对应一个过程,而且每一个帧指针+4的位置都存储着函数的返回地址,每一个帧指针指向的存储器位置当中都备份着调用者的帧指针。各位需要知道的是,每一个栈帧都建立在调用者的下方 (也就是地址递减的方向) ,当被调用者执行完毕时,这一段栈帧会被释放。还有一点很重要的是,%ebp和%esp的值指示着栈帧的两端,而栈指针会在运行时移动,所以大部分时候,在访问存储器的时候会基于帧指针访问,因为在一直移动的栈指针无法根据偏移量准确的定位一个存储器位置。 还有一点比较重要的内容,就是栈帧当中内存的分配和释放。由于栈帧是向地址递减的方向延伸,因此如果我们将栈指针减去一定的值,就相当于给栈帧分配了一定空间的内存。这个理解起来很简单,因为在栈指针向下移动以后 (也就是变小了) ,帧指针和栈指针中间的区域会变长,这就是给栈帧分配了更多的内存。相反,如果将栈指针加上一定的值,也就是向上移动,那么就相当于压缩了栈帧的长度,也就是说内存被释放了。需要注意的是,上面的一切内容,都基于一个前提,那就是帧指针在过程调用当中是不会移动的。 函数调用的故事 调用者的各种参数入栈 调用者的返回地址入栈,这个是用 前指令地址++ 作返回地址的 调用者的帧指针入栈保护 (本次调用的基址指针就指向这里) 调用者的寄存器入栈保护 被调用的函数的局部变量的分配 https://blog.csdn.net/u011822516/article/details/20001765 https://www.tenouk.com/Bufferoverflowc/Bufferoverflow2a.html https://zhuanlan.zhihu.com/p/37537046

1 min · 29 words · -

equipment, device

“equipment, device” equipment “Equipment” 通常指 “成套的,不只一件的设备”。而且,与 “device” 和 “appliance” 不同的是,“equipment” 不光包括 “电子设备”,还包含相关的工具。比如,上文提到的 “cycling and diving equipment 自行车和潜水装备” 中可能包括服装、自行车灯、潜水眼镜、呼吸器等物品;再如,“医疗设备” 的说法是 “medical equipment”。比如,虽然 “听诊器 stethoscope” 是一种 “medical equipment”,但它并不是一个 “medical device”,因为听诊器不是电子的。 device device" 通常指 “小巧的电子装置或设备”,比如 “移动设备 mobile device”、“听力装置 listening device”。“Device” 是可数名词。来听一个例句。

1 min · 38 words · -

embedded basic

“embedded basic” MCU 微控制单元MCU (Microcontroller Unit) 又叫单片机、微处理器,是集成电路的一种。MCU类似于CPU,是可以执行嵌入式程序的一种集成电路。 MCU执行的程序叫嵌入式程序。嵌入式程序可以存储在MCU上,也可以存储在外面的存储器上。比如Flash就是存储器的一种。 模组: 芯片必须配合一些外围设备才能工作。为了方便厂家使用,模组厂家会集成一些外围部件,并写入嵌入式程序,整体打包后作为一个解决方案,给设备厂家使用。 MCU可以算是CPU+RAM+ROM+UART+TIMER+RTC等简单外设。 SoC (System on Chip) ,中文名是片上系统。SoC含义很多,有一种定义是一个有专用目标的集成电路,是一个包含嵌入式软件的完整系统。SoC方案中,对设备所有智能化操作都是通过模组来实现的,设备无需另外增加MCU。此类控制通常而言比较简单,例如开关,灯之类的产品,只需要几个IO口,就可以控制产品。 JTAG JTAG (Joint Test Action Group,联合测试行动小组) 是一种国际标准测试协议 (IEEE 1149.1兼容) ,主要用于芯片内部测试。现在多数的高级器件都支持JTAG协议,如ARM、DSP、FPGA器件等。标准的JTAG接口是4线: TMS、 TCK、TDI、TDO,分别为模式选择、时钟、数据输入和数据输出线。 相关JTAG引脚的定义为: TMS: 测试模式选择,TMS用来设置JTAG接口处于某种特定的测试模式; TCK: 测试时钟输入; TDI: 测试数据输入,数据通过TDI引脚输入JTAG接口; TDO: 测试数据输出,数据通过TDO引 脚从JTAG接口输出; SWD接口 串行调试 (Serial Wire Debug) ,应该可以算是一种和JTAG不同的调试模式,使用的调试协议也应该不一样,所以最直接的体现在调试接口上,与JTAG的20个引脚相比,SWD只需要4个 (或者5个) 引脚,结构简单,但是使用范围没有JTAG广泛,主流调试器上也是后来才加的SWD调试模式。 SWD和传统的调试方式区别: SWD模式比JTAG在高速模式下面更加可靠。在大数据量的情况下面JTAG下载程序会失败,但是SWD发生的几率会小很多。基本使用JTAG仿真模式的情况下是可以直接使用SWD模式的,只要你的仿真器支持,所以推荐大家使用这个模式。 在大家GPIO刚好缺一个的时候,可以使用SWD仿真,这种模式支持更少的引脚。 在大家板子的体积有限的时候推荐使用SWD模式,它需要的引脚少,当然需要的PCB空间就小啦!比如你可以选择一个很小的2.54间距的5芯端子做仿真接口。 RDI 接口 远程调试接口 (Remote Debug Interface) ,是ARM公司提出的标准调试接口,主要用于ARM芯片的仿真,由于各个IDE厂商使用的调试接口各自独立,硬件无法进行跨平台的调试。现在众多的IDE厂家都逐步采用标准RDI作为ARM仿真器的调试接口,因此使跨平台的硬件调试成为可能。EasyJTAG由于使用标准RDI调试接口,因此在任何使用标准RDI接口的IDE调试环境中都可以使用,例如ARM公司的ADS1.2/IAR公司的EWARM 3.30 。 J-Link J-Link是最著名的ARM开发调试工具,J-Link由SEGGER公司生产。提供对市面上几乎所有ARM内核芯片的支持。目前最新版本的J-Link产品为V8,支持JTAG和SWD模式。并且对主要的IDE环境如KEIL、IAR都有良好的支持。优点很多,因此也是首选的调试工具。 所以JLINK就是怎么个作用呢? 起到一个中间转换桥梁,芯片测试用的是JTAG,而JTAG另一端在早起是并口,而现在大多都是USB口,中间过度的重担就交给了Jlink。 ULink仿真器 ULINK是ARM/KEIL公司推出的仿真器,目前网上可找到的是其升级版本,ULINK2和ULINK Pro仿真器。ULINK/ULINK2可以配合Keil软件实现仿真功能,并且仅可以在Keil软件上使用,增加了串行调试 (SWD) 支持,返回时钟支持和实时代理等功能。开发工程师通过结合使用RealView MDK的调试器和ULINK2,可以方便的在目标硬件上进行片上调试 (使用on-chip JTAG,SWD和OCDS) 、Flash编程。 ...

2 min · 337 words · -