Gogs和DroneCI 0.7版本配置

之前用Drone 0.4版本,以为直接用就可以了,dock run之后一直提示错误,翻了Drone的文档才知道配置是有区别的。这里以Gogs的地址为192.168.2.12:3000,Drone的地址为192.168.2.12:8000为例。

启动drone容器:

docker run --volume /var/lib/drone:/var/lib/drone -i -t \
    --volume /var/run/docker.sock:/var/run/docker.sock \
    --restart=always \
    --publish=8000:8000 \
    --env-file dronerc \
    --detach \
    --name=droneci drone/drone:latest

dronerc文件的内容:

DRONE_OPEN=true
DRONE_HOST=${DRONE_HOST}
DRONE_GOGS=true
DRONE_GOGS_URL=http://192.168.2.12:3000
DRONE_SECRET=${DRONE_SECRET}

使用Gogs和Drone也有一年半了,对于嵌入式开发来说,Drone更多被我用来制做镜像包分发给客户,算是减少了一部分重复的人工工作量,其他同事也可以参与任何一个项目的分发环节。也由于硬件的绑定,不能让Drone参与到硬件上的软件测试工作中。最近有了解一些jenkins应用到硬件的文章,希望以后嵌入式开发也可以享受到更便捷的开发方式和工具。

Freescale i.MX28 AUART应用RS485

0x0

最近有客户使用i.MX28的SOM模块开发产品,其中用到了RS485通讯,发现发送时延时在百毫秒级,由于上层应用协议要求是微秒级,客户要求减少发送的延时。问题看起来很简单,解决起来也是小波折。总归还是自己对kernel知识理解不够深入。

0x1

了解问题背景后,就去看AUART的实现代码,之前开发imx28的同事已经在mxs_auart_tx_chars()的前后加入了gpio的操作,

static inline void mxs_auart_tx_chars(struct mxc_auart_port *s)
{
    if(s->port.line == 1){
        gpio_set_value(MXS_AUART_RS485_EN, 1);
    }

    // ignore more send code

    if (s->port.line == 1) {
        do {
            status = __raw_readl(s->port.membase + HW_UARTAPP_STAT);
        } while (!(status & BM_UARTAPP_STAT_TXFE) || (
            status & BM_UARTAPP_STAT_BUSY));
        gpio_set_value(MXS_AUART_RS485_EN, 0); // Add by JBO, Disable send
    }
}

细看之后觉得do while用法在这里可能是问题的根源。看了下有mxs_auart_stop_tx(),应该放在里面做符合tty规范么,结果一测,发现stop_tx就没有执行。然后翻datasheet和代码,才知道auart没有FIFO Empty的中断,所以TX中断后要polling去查FIFO Empty flag再拉gpio。然后在网上看到有网友的解决相同问题的记录,依样画瓢改成tasklet处理了。其中也是小状况,就这位网友说的那样,"很多事情都是想得简单,做起来的时候各种意外"。

这里把gpio的操作放在了start_tx()和stop_tx()里面了,mxs_auart_tx_chars()里的检查xmit buf为空后,执行tasklet_hi_schedule(&my_task0);启动tasklet任务,然后由rs485_mode_func()来检查FIFO是否为空,再操作gpio。

void rs485_mode_func(unsigned long data)
{
     struct uart_port *u = data;
     struct mxs_auart_port *s = to_auart_port(u);
     int status;
 
     dev_dbg(s->dev, "%s: control RS485 line\n", __FUNCTION__);
     if (s == NULL)
         return;
     if (s->port.line == 1){
         if(!(readl(s->port.membase + HW_UARTAPP_STAT) & BM_UARTAPP_STAT_TXFE)){
             udelay(10);
             tasklet_hi_schedule(&my_task0);
         }else{
             mxs_auart_stop_tx(&s->port);
         }
     }
}

Reference

linux rs485 GPIO 方向控制问题

i.MX6UL编译OpenWrt系统

几年前在思科的Wrt54G路由器上尝试各种OpenWrt的固件(PS或许这也是踏上嵌入式不归路的开始征兆),这次可以学习下如何给i.MX6UL/i.MX6ULL编译OpenWrt的镜像。由于只是用OpenWrt的系统,所以uboot和kernel是现成的。这里,把整个系统放在SD卡上,两个分区,一个分区为uboot.imx, zImage, dtb,第二个分区是OpenWrt的文件系统。

编译

编译过程相比多年前简单多了,直接下载,同步feeds,配置config文件的步骤就可以了。

git clone https://github.com/openwrt/openwrt
cd openwrt
./script/feeds update -a
./script/feeds install -a
make menuconfig
make -j4

"make menuconfig"的配置要修改的地方如下:

CONFIG_TARGET_imx6=y
CONFIG_TARGET_imx6_Generic=y
CONFIG_DEFAULT_TARGET_OPTIMIZATION="-Os -pipe -march=armv7-a -mtune=cortex-a7 -mfpu=neon"

其它的配置看自己需要启动就可以了,luci是必需要选的。

运行截图

分别是终端上查看cpuinfo信息和luci上显示系统状态信息截图。

mys6ulx-OpenWrt-cpuinfo.png
mys6ulx-OpenWrt-luci.png

i.MX6UL应用web服务器Monkey

以前刚学嵌入式的时候,在micro2440上移植过GoAhead,不过介于cpu和内存,只是简单的显示静态网页。i.MX6UL和i.MX6ULL的核心要比2440好很多了,运行web server也更容易了。

Monkey是一个高性能的开源Web服务端软件。它被设计于更易扩展和低内存消耗。支持ARM, x86和x64平台。

下面以i.MX6UL为例,使用前需要先编译并部署在开发板上,本文使用Yocto的方式,构建并安装在最终镜像内,生成的镜像方便向更多设备部署。

构建

基于Yocto构建就比较方便了,同时Monkey也提供Yocto的bb文件。"bitbake monkey"只是编译了Monkey,并没有安装到镜像包内。需要修改core-image-base.bbappend文件加入到"IMAGE_INSTALL"变量即可。

git clone https://github.com/monkey/monkey-yocto
cp -r monkey-yocto/monkey fsl-release-yocto/sources/poky/meta/recipes-extended/
cd fsl-release-yocto
source setup-environment build
bitbake monkey
vi ../sources/meta-myir-imx6ulx/recipes-core/images/core-image-base.bbappend
bitbake core-image-base

运行时截图

Monkey默认是绑定0.0.0.0:2001地址,所以配置好IP地址就可以访问了。HTML默认存储在/var/www/monkey目录,站点配置在/etc/monkey/sites/default文件中。

mys6ulx-Monkey.png

Reference

Monkey Document
Monkey Official Website

macOS终端复制粘贴格式

macOS上从终端复制选中文本后,再粘贴到其它应用中会出现黑色背景,是原因默认是带format格式的。可以使用"cmd + shift + v"只粘贴文本内容。

macOS 10.11加载kext

手上有个Exar 1410的串口转换器,官方有提供mac的驱动,但没有签名。而macOS上已开启SIP功能,系统目录SLE不能直接写。这里可以关闭对SLE的限制。关机后按cmd + r进入Recover模式,打开终端窗口。

csrutil enable --without kext

Win10下打包Qt5.8应用

不知道从什么时候开发Qt有提供了windeployqt.exe工具,可以直接把qt应用相关的库提取出来。windeployqt.exe的路径在"<Qt安装目录>/bin"下面,为方便使用可以加入到系统环境变量中。需要先以Release方式编译应用,再新建一个目录,把应用binary放在目录下,然后再执行windeployqt.exe工具,如下:

windeployqt.exe helloworl.exe

执行成功后,会在当前目录下出现一些dll文件和目录:

iconengines/
imageformats/
platforms/
translations/
D3Dcompiler_47.dll
libEGL.dll
libGLESV2.dll
opengl32sw.dll
Qt5Core.dll
Qt5Gui.dll
Qt5SerialPort.dll
Qt5Svg.dll
Qt5Widgets.sll
helloworld.exe

目录有35MB左右,可以直接打包7z来分发使用。当然有需要也可以打包成单exe文件或再加壳压缩。

打包完后在其它PC运行发现还是缺少一些库文件,如libgcc_s_dw2-1.dll, libwinpthread-1.dll。查了查是因为我使用的是mingw工具链的原因。顺便想起现在很多语言的项目管理工具都是自动解决依赖的功能,Qt要加油了。

最新文章

最近回复

  • Blackrose: 感谢拍砖!嗯,那句话...
  • aa: “Raspberry...
  • Blackrose: 外部只是帮你把芯片启...
  • : 内部时钟比外部的频率...
  • Blackrose: 你这评论比正文更有内容么
  • 7hao: CR+LF ...
  • Blackrose: 可以是你更新软件源后...
  • sxk: 博主,我的系统是ub...
  • Blackrose: 你深得精髓么
  • qihao: 这篇文章的简单总结就...

分类

归档

其它