微控圈（MCU Loop） - 2018年12月
type: channel
link: https://www.mculoop.com/2018/12/
description: 嵌入式、物联网技术交流分享
items: Ubuntu 安装 vsftpd
items: STM8S 使用笔记
items: 如何使用 C++ Builder 的远程调试功能
items: Ubuntu 安装 PHP
items: Ubuntu 安装 Nginx
items: CSS 学习笔记

Ubuntu 安装 vsftpd
type: item
date: 2018-12-20T16:00:00+00:00
description: sudo apt install vsftpd service vsftpd start service vsftpd status 默认系统用户是可以登录的。 编辑配置文件 /etc/vsftpd.conf 取消注释：write_enable=YES service vsftpd restart

STM8S 使用笔记
type: item
date: 2018-12-10T16:00:00+00:00
description: 1、GPIO 关于 SWIM 用作普通 GPIO 脚 即使 CFG_GCR 的 SWD 脚不置为 1，事实上 PD1 脚也可正常执行输入输出功能，只不过在同时使用 SWIM 调试时，即使设置 DDR 为输出，ODR 总保持为 1。关开 SWIM 连线，复位 MCU 后输出功能可正常执行。SWD 位看似没有什么作用，不过还是按手册所说的方式来做吧。另外也不必担心 SWIM 功能因为该配置而被禁用。 关于开漏输出脚 手册上打 T 标记的是真正的开漏脚，不具备推挽输出的功能，也没有内部上拉功能。使用时需要特别注意。 2、读 TIMx_CNTR 要分别读 TIMx_CNTRH 和 TIMx_CNTRL（分别读 TIMx_CNTRL 和 TIMx_CNTRH 也没错），因为发现直接读 16 位的 TIMx_CNTR 可能出现错误： 明明 TIMx_CNTR 的值是 829，偏偏赋值给一个变量后变量的值是 789。但也不总是有问题，运行几次就好了，复位后现象依旧，但分别读 TIMx_CNTRH 和 TIMx_CNTRL 并赋值给变量就正常，连续读两次 TIMx_CNTR 也是正常的。 3、关于 COSMIC 编译器 编译器有三个自用的变量 c_x、c_y、c_lreg，当与中断函数关联时： （1）当中断函数直接使用（编译器自动产生汇编代码）他们时，会被自动保存和恢复； （2）当终端函数调用使用了 c_x、c_y 的函数时，c_x、c_y 会被自动保存和恢复，但是 c_lreg 不会被这样自动保存和恢复； 这就要特别注意：如果中断中调用了使用 longs 或者 floats 的函数时就要在中断函数的定义中加修饰词 @svlreg！ 不太好判断是否使用了 c_lreg（需要反汇编才能看），例如 c_lgadc（长整数加无符号单字节）就没有用到这三个变量，所以在不影响性能的是否加上无妨，除非你的应用很在意那几个 pushw、popw。 4、一个配置字初始化引起的问题 同样的软件延时程序在不同的板子上一个验时是 4ms，一个是 3ms，如果用硬件定时器来实现验时则一致。 读出配置字为 000000F0F000FFFE00，而正常情况下应该读出的是全 0。置 1 的那些位是保留位，具体作用不清除，将其都清零以后延时都是 3ms 了。 可能保留的配置字影响了指令执行等待时间等参数。通过这个问题来看，如果烧写程序时（尤其是 debug 程序时）不烧写正常的配置字进去，可能会造成程序的异常执行。 5、stm8 cosmic 用 sp 索引变量，如果用 push cc 保存寄存器至栈会造成由于编译器不能识别嵌入式汇编而造成的后续代码的变量使用的错误，所以要用 push cc 然后 pop a 的方式获取 cc 的值并返回，不能保存在栈里： uint8 EnterCritical(void) { #asm push cc sim pop a #endasm } 6、关于 STVD 开发环境 如果出现编辑界面或仿真界面布局变乱，可以删除 .wed 文件（存储开发界面信息）或 .wdb 文件（存储仿真界面信息），以初始化界面。 7、关于 memcpy cosmic 的 memcpy 是从后往前拷贝，这样当 src 与 dst 重叠时，比如 memcpy(buf, buf + 5, 10) 结果就不是我们预想的，可以使用 memmove 来代替，它会检查是否重叠。当 dst 大于等于 src 时，从前往后拷贝（常规顺序）。 8、stm8 终端向量表 由操作码 0x82（INT）与三字节的地址组成，执行过程是将三字节地址赋给 PC，程序将跳转到该地址处执行。

如何使用 C++ Builder 的远程调试功能
type: item
date: 2018-12-05T07:07:00+00:00
description: 突然有一天，本机上好好地运行的软件，在另外一台计算机上莫名其妙地出问题，有没有？除了在这台计算机上装套开发环境，还有没有别的办法？答案是肯定的。远程调试手段是软件开发调试的利器，尤其是在软件发布后个别计算机上发现了异常的时候。 以 C++ Builder 6 为例，远程计算机上须安装 Borland Remote Debugger，需要注意版本的匹配，他可以从 IDE 安装盘直接安装或者从安装盘里提取出 RDEBUG 安装文件夹来安装。 [...]

Ubuntu 安装 PHP
type: item
date: 2018-12-04T16:00:00+00:00
description: 安装： sudo apt-get install php Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: php-common php7.0 php7.0-cli php7.0-common php7.0-fpm php7.0-json php7.0-opcache php7.0-readline Suggested packages: php-pear The following NEW packages will be installed: php php-common php7.0 php7.0-cli php7.0-common php7.0-fpm php7.0-json php7.0-opcache php7.0-readline 0 upgraded, 9 newly installed, 0 to remove and 0 not upgraded. Need to get 3,532 kB of archives. After this operation, 14.1 MB of additional disk space will be used. Do you want to continue? [Y/n] 除了自动安装的 php7.0-cli php7.0-common php7.0-fpm 等，再安装一些模块： sudo apt-get install php7.0-mysql php7.0-curl php7.0-mcrypt php7.0-mbstring php7.0-xml 测试： php -v PHP 7.0.32-0ubuntu0.16.04.1 (cli) ( NTS ) Copyright (c) 1997-2017 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies with Zend OPcache v7.0.32-0ubuntu0.16.04.1, Copyright (c) 1999-2017, by Zend Technologies php7.0-fpm 服务控制： sudo service php7.0-fpm stop sudo service php7.0-fpm start sudo service php7.0-fpm restart sudo service php7.0-fpm status

Ubuntu 安装 Nginx
type: item
date: 2018-12-04T16:00:00+00:00
description: apt-get install nginx # 安装 service nginx status # 查看服务运行状态 netstat -nap |grep nginx # 查看服务所使用的端口 网页浏览器访问服务器 IP 显示： Welcome to nginx! If you see this page, the nginx web server is successfully installed and working. Further configuration is required. For online documentation and support please refer to nginx.org. Commercial support is available at nginx.com. Thank you for using nginx.

CSS 学习笔记
type: item
date: 2018-12-04T16:00:00+00:00
description: 什么是 CSS CSS 是 Cascading Style Sheets（层叠样式表）的缩写，用于定义如何显示 HTML 中的元素。 如何理解“层叠” 当同一个 HTML 元素被不止一个样式定义时，会使用哪个样式呢？ 一般而言，所有的样式会根据下面的规则层叠于一个新的虚拟样式表中： 浏览器缺省设置 外部样式表 引用外部样式表文件： 内部样式表 样式直接定义在 HTML 文档头部： 内联样式 在元素标签内使用 style 属性定义样式： This is a paragraph 按从上到下的顺序，优先级逐渐提升。 CSS 语法 CSS 的基本语法为：selector {property: value;} 在一条定义中，可以有多个选择器，选择器间用逗号隔开（选择器的分组）；也可以有多条“属性-值”对，使用分号隔开。 h1,h2,h3,h4,h5,h6 { color: green; font-family: Times, "Times New Roman", serif; } CSS 选择器 id 选择器 id 选择器可以为标有特定 id 的 HTML 元素指定特定的样式。id 选择器以 "#" 来定义。 这个段落是红色。 这个段落是绿色。 派生选择器 派生选择器允许你根据文档的上下文关系来确定某个标签的样式。通过合理地使用派生选择器，我们可以使 HTML 代码变得更加整洁。例如下面的样式定义了 id="sidebar" 元素下的 p 元素的样式（注意使用了空格作为分隔符）： #sidebar p { font-style: italic; text-align: right; margin-top: 0.5em; } 类选择器 类选择器以一个点号定义，类（class）与 id 的区别是，id 一般在 HTML 中的定义是唯一的。 This heading will be center-aligned This paragraph will also be center-aligned. 选择器列表 CSS 选择器用于选择要使用样式的网页元素。 选择器 实例 实例描述 .class .intro 选择 class="intro" 的所有元素 .class1.class2 .name1.name2 选择 class 属性中同时有 name1 和 name2 的所有元素 .class1 .class2 .name1 .name2 选择作为类名 name1 元素后代的所有类名 name2 元素 #id #firstname 选择 id="firstname" 的元素 * * 选择所有元素 element p 选择所有 元素 element.class p.intro 选择 class="intro" 的所有 元素 element,element div, p 选择所有 元素和所有 元素 element element div p 选择 元素内的所有 元素 element>element div > p 选择父元素是 的所有 元素 element+element div + p 选择紧跟 元素的首个 元素 element1~element2 p ~ ul 选择前面有 元素的每个 元素 [attribute] [target] 选择带有 target 属性的所有元素 [attribute=value] [target=_blank] 选择带有 target="_blank" 属性的所有元素 [attribute~=value] [title~=flower] 选择 title 属性包含单词 "flower" 的所有元素 [attribute|=value] [lang|=en] 选择 lang 属性值以 "en" 开头的所有元素 [attribute^=value] a[href^="https"] 选择其 src 属性值以 "https" 开头的每个 元素 [attribute$=value] a[href$=".pdf"] 选择其 src 属性以 ".pdf" 结尾的所有 元素 [attribute*=value] a[href*="w3schools"] 选择其 href 属性值中包含 "w3schools" 子串的每个 元素 :active a:active 选择活动链接 ::after p::after 在每个 的内容之后插入内容 ::before p::before 在每个 的内容之前插入内容 :checked input:checked 选择每个被选中的 元素 :default input:default 选择默认的 元素 :disabled input:disabled 选择每个被禁用的 元素 :empty p:empty 选…