tag 标签: vybrid

相关博文
  • 热度 24
    2016-6-29 10:23
    2221 次阅读|
    0 个评论
    By Toradex Leonardo Graboski Veiga 1).  简介 物联网(Internet of Things)概念的本质其实就是关于发送数据到网络,所以称为云服务。随着时代发展和技术进步,人们可以使用尺寸更小功耗更低的电子设备并很容易的连接到云端,不过有一个问题却始终困扰着电子工程师们:如何使用这些获取的数据?而这正是物联网的主题。 在 Microsoft主页 上面有一些实际的应用例子来展示IoT的应用:一个电梯公司通过物联网来改善并提供预先维护;一个工业自动化公司通过物联网深入了解油气产业供应链,同时提供预先维护;还有一个公司通过IoT预测驾驶人员行为然后优化汽车利用。在读完这个系列文章后,我们期待读者可以拥有足够的知识和工具去部署应用来深度检视同时优化整个系统 – 不仅仅是积攒了一堆数据,而是从中获取了有用的结果! Azure 是Microsoft提供的云服务平台,提供了多种应用如数据库,虚拟机,应用服务,机器学习,数据流分析,媒体和CDN服务,大数据解决方案,以及包括IoT Hub的其他众多应用。就其提供的大量应用本身已经是使用Azure服务的很好理由,但Microsoft更进一步通过和Amazon Web Services的 对比 来进一步证明其方案是更好的 – 和前面相反,这是一个通过用户和时间来确认的强有力宣言。另外,高安全性,易于整合以及容易上手也是选择Azure服务的另一个理由。 本系列文章通过开发一个IoT应用,从读取现场传感器数据,展示数据到获取商业智能(BI)。所使用的用来连接传感器以及上传数据到云端的平台: Azure IoT certified partner  Toradex 的 Colibri VF61 计算机模块 +  Iris Carrier Board 。应用程序获取传感器数据然后上传到来自Microsoft Azure云解决方案的一个叫做Azure IoT Hub的IoT服务,然后就可以被各种所需要的Microsoft Azure服务来处理。这部分内容将在本系列文章的第二部分着重讲解,在此我们主要关注在如何配置Azure IoT Hub以及上传数据到它上面。 我们选用的IoT环境为模型车监控。为了演示方便,将Toradex平台和传感器置于遥控模型汽车内,如下图1所示;而图2则给出的目标应用的框图。   图1 :遥控汽车   图2 :应用框图 我们所选用的应用编程语言为Javascript 配合Node***: 一个服务器端(本文中即Toradex嵌入式系统)基于Chrome V8 引擎编译的Javascript解释器。这个选择是考虑到Azure IoT Hub SDKs 可以提供的开发库。但是需要注意的是现在IoT Hub SDKs正处于频繁更新中,每一次更新都会有些改变(至少Node相关),所以在使用前需要考虑清楚。本文所使用的Azure IoT Node包版本为1.0.1。 整个环境的搭建,从开发嵌入式系统应用,到配置Azure来获取数据我们分为3个主要步骤,下面会分别介绍: ./  配置Azure 环境 ./  添加设备并发送信息到IoT Hub ./ Toradex 嵌入式系统应用开发   2).  配置 Azure 环境 首先需要创建一个新的Azure账户:从Azure 网站可以申请30试用的免费账户。然后就可以使用账户里一定数目的信用额度来免费部署应用使用Azure 服务;同样,IoT Hub也有一个用于开发的包含有限资源的免费版本,且不受试用期限制。关于价格和IoT Hub的详细信息,请见 这里 。 设置好Azure账户后,需要创建IoT Hub。用新创建的Azure账户登陆Azure portal,选择 +New Internet of Things Azure IoT Hub。新的IoT Hub配置界面如下图3所示,“Pricing and scale tier”选项需要选择“Free”;然后在“Resource Group”选项创建一个新的资源组,另外“Location”选项需要和后面部署的服务保持一致;“Name”可以自由设定,而“IoT Hub Units”和”Device-to-cloud“选项在免费版本中则无法修改。点击“Create”后,服务就被部署了,这个过程可能需要几十秒时间。   图3 :从Azure Portal 创建IoT Hub 上面操作完成后,可以看到IoT Hub已经出现在控制台,也就是 Azure Portal主页 。点击后,如下图4所示页面会打开:里面包含“Essentials” 是如IoT Hub地区等基本信息;“Usage”是提供给系统管理员注册设备数目以及从设备发送信息数量的反馈信息;“Monitoring”是显示收到信息数量。   图4 :IoT Hub  主面板 仍然在IoT Hub主面板上,为了让其他应用也可以访问服务,”Settings“选项卡里面的“Shared access policies“选项需要被选中。在新打开的” Shared access policies“选项卡中,点击“iothubowner”规则选项,这个包含了本IoT Hub所有可能的权限。如下图5所示,“iothubowner”选项卡会打开,然后复制”Connection string – primary key”对应的内容留作后用:这个是下一步用于管理和监控这个IoT Hub服务的钥匙。   图5 :获取iothubowner connection string   3).  添加设备并发送信息到 IoT Hub 现在云端设置已经完成,我们需要在开发主机上面安装 iothub-explorer 工具来添加设备到IoT Hub,另外如果开发主机是Windows的话,也可以选择 Device Explorer 工具。鉴于本文所使用的开发主机系统为Ubuntu 14.04,我们采用iothub-explorer。需要注意所需Node版本为0.12.x或以上(根据说明如需全部功能工作需要4.x或以上版本),但目前apt-get工具只能安装0.10.x版本。为了解决这个问题,需要先后安装Node Version Manager(NVM)和Node 版本0.12.9. 然后在终端中使用NPM(Node Package Manager)来安装iothub-explorer。 --------------------- $ npm install iothub-explorer@latest --------------------- 然后可以运行iothub-explorer help参数来查看使用方法 --------------------- $ iothub-explorer help --------------------- 根据上面命令的打印结果,iothub-explorer 包含有create和monitor事件参数。首先,我们配合上面图5中获取的connection string使用iothub-explorer工具来创建一个设备“tdx_iot_car”。注意“--connection-string”参数用来显示设备connection string (和图5中获取的IoT Hub connection string不同),这个也需要保存下来用来连接这个新创建的设备到IoT Hub,是的可以使用Colibri VF61应用来发消息到Hub。 --------------------- $ iothub-explorer "HostName=toradex.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=putyoursharedaccesskeyfromtheconnectionstringhere" create tdx_iot_car --connection-string Created device tdx_iot_car - deviceId:                   tdx_iot_car generationId:               635931262207620183 etag:                       MA== connectionState:            Disconnected status:                     enabled statusReason:               null connectionStateUpdatedTime: 0001-01-01T00:00:00 statusUpdatedTime:          0001-01-01T00:00:00 lastActivityTime:           0001-01-01T00:00:00 cloudToDeviceMessageCount:  0 authentication: SymmetricKey:       primaryKey:   somesharedaccesskeyreturned       secondaryKey: somesecondaryaccesskeyreturned - connectionString: HostName=toradex.azure-devices.net;DeviceId=tdx_iot_car;SharedAccessKey=somesharedaccesskeyreturned ---------------------   4). Toradex 嵌入式系统应用开发 现在来设置 Colibri VF61  计算机模块 +  Iris 载板 。本文中使用Toradex发布的预编译Linux image( Colibri_VF_LinuxConsoleImageV2.5 ),如何刷写image到模块请参考 这里 。然后请参考下面步骤安装Node***, NPM 包和git – 安装过程需要一些时间,尤其是curl步骤。 --------------------- # opkg update # opkg install nodejs # opkg install tar # curl -L https://www.npmjs.com/install.sh | sh # opkg install git --------------------- 本文所展示的例程(send_data***)相关packages installer和node文件存放于 这里 ,可以通过下面命令将其clone到目标板上面并安装node packages --------------------- # git clone https://github.com/leograba/azure-iot-car.git # root@colibri-vf:~# cd azure-iot-car # root@colibri-vf:~# npm install --------------------- 现在我们可以在目标板上面运行例程向IoT Hub发送数据,但有几点需要解释下:例程使用HTTP协议通讯,但AMQP和MQTT协议也是支持的;变量“connecionString”数值必须和上面用iothub-explorer工具创建新设备时候所保存下来string一致: --------------------- var connectionString = "HostName=toradex.azure-devices.net;DeviceId=tdx_iot_car;SharedAccessKey=somesharedaccesskeyreturned" --------------------- Setinterval()循环函数随机产生数值发送到IoT Hub, 用来模拟传感器数据,如温度,声纳传感器距离数据,加速度和陀螺仪传感器,一些gps坐标数据和来自目标板的时间日期等。如何从真实传感器获取数据将在这个系列文章的下一篇进行说明。JSON Stringify() 函数用来产生一个JSON编码数据串,然后封装于Message object用于发送。下面是一个JSON格式数据串示例: --------------------- {"ObjectName":"toradex2", "ObjectType":"SensorTagEvent", "temp":24.889683, "acceleration: {"accel_x":10.018892,"accel_y":0.039468,"accel_z":-0.081328}, "gyroscope": {"gyro_x":-0.0532362,"gyro_y":-0.01597086,"gyro_z":0}, "distance":0.17017, "boardTime":1458064972706} --------------------- 正常情况下,在程序运行时候sendEvent()函数里面的callback函数不应打印任何串口输出。下面是在Colibri VF61上面运行程序并正常工作时候的串口打印输出: --------------------- # node send_data*** sending message to the IoT Hub sending message to the IoT Hub sending message to the IoT Hub sending message to the IoT Hub sending message to the IoT Hub sending message to the IoT Hub sending message to the IoT Hub sending message to the IoT Hub --------------------- 为了确保数据被收到,在Azure Portal IoT Hub面板会显示每天的消息计数,同时监控图表上面会有尖峰显示,如下图6所示。需要注意这些信息大概需要几十秒才会在portal上面显示出来。   图 6:  在Azure Portal 中确认数据被收到 另外,也可以使用iothub-explorer工具通过“monitor-event”参数配合device id来查看发送到IoT Hub的数据流,不过需要Colibri VF61程序要同步运行,而通过Azure Portal查看则不需要。下面图7展示了iothub-exploer收取目标板发送数据情况,上面是具体监测数据命令: --------------------- $ iothub-explorer "your_iothub_connection_string" monitor-events yourdevice ---------------------   图7 :用iothub-explorer 收取目标板发送数据   5).  总结 Microsoft Azure网站上面提供了很多文档用于帮助用户开发更复杂和稳固的应用。参考这些文档可以从中获取更多有用信息,如创建一个设备,或者从Hub获取设备发送的数据是可以通过编程来完成的。另外,在接下来的文章中我们将侧重连接真实传感器到Colibri VF61 + Iris载板,并传输真实传感器数据到IoT Hub, 这个也可以用作其他Azure 服务来给设备部署应用提供深度检视或变量操控。 我们希望通过本文可以让用户了解并最终使用Toradex 嵌入式系统方案配合Auzre IoT Hub服务,然后从中获益。同时,我们也想在这里感谢来自巴西的Grupo Viceri团队在Azure and Business Intelligence上面的丰富经验最终促成了这个IoT Car 项目。 本文最初发表于Embarcados.com, Portuguese,详见这里。
  • 热度 29
    2016-6-3 11:52
    1730 次阅读|
    0 个评论
    1). 简介 MQX是由NXP提供的实时操作系统,结构框图如下图所示, 包含内核,文件系统以及协议栈, 同时对于NXP的ARM处理器也可以很好的支持,可以很方便的开发和部署. 本文就基于Toradex Colibri VF61 (基于NXP VF61 SoC) ARM计算机模块搭配Colibri Eva Board开发板来演示编译和部署MQX应用. VF61为异构双核架构ARM处理器,包含一个Cortex-A5和一个Cortex-M4,通常应用场景为A5核心运行Linux或者WinCE系统作为控制和界面显示,M4核心运行一个实时操作系统来处理实时任务. 本文所演示的即是在M4核心上面部署运行MQX应用. 2). 准备 a). 硬件准备 ./ Colibri VF61计算机模块和Colibri Eva Board开发板 ./ Ubuntu Linux开发主机 b). 软件准备 ./ VF61模块A5核心运行Toradex Embedded Linux release V2.5 Beta3 ./ Ubuntu Linux开发主机 ./ MQX RTOS 4.1.2 Vybrid - 从这里下载 ./ Linaro bare-metal toolchain for Cortex-R/M, 4.8 2014-Q1 update - 从这里下载 3). 配置 a). 解压缩到”/home/username”目录下 ------------------------ $ tar xzf “~/MQX RTOS 4.1.2 for Vybrid Linux Base.gz.gz” $ tar xjf ~/gcc-arm-none-eabi-4_8-2014q1-20140314-linux.tar.bz2 ------------------------ b). 配置MQX ./ 文件 ”FSLMQXOS_4_1_2_Vybrid/build/common/make/global.mak” 设置交叉编译toolchain ------------------------ + TOOLCHAIN_ROOTDIR = /home/yourname/gcc-arm-none-eabi-4_8-2014q3/ ------------------------   ./ 文件  “FSLMQXOS_4_1_2_Vybrid/config/twrvf65gs10_m4/user_config.h” 由于VF61 A5和M4共享外设资源,因此在使用M4外设时候要通过修改A5 Device Tree来确保此外设没有被A5已经占用.本文后续只测试M4调用GPIO,因此将其他和A5冲突的外设资源都去掉,实际应用中可以根据具体情况做配置. ------------------------ ... #define BSPCFG_ENABLE_I2C0                  0 #define BSPCFG_ENABLE_II2C0                  0 ... #define BSPCFG_ENABLE_SPI0                   0 ... #define BSPCFG_ENABLE_RTCDEV               0 ... #define BSPCFG_ENABLE_ESDHC                0 #define BSPCFG_ENABLE_SAI                    0 ... #define BSPCFG_ENABLE_TTYB                   0 #define BSPCFG_ENABLE_ITTYB                  0   #define BSPCFG_ENABLE_TTYC                   1 #define BSPCFG_ENABLE_ITTYC                   0 ... ------------------------   ./ 文件 ”FSLMQXOS_4_1_2_Vybrid/mqx/source/bsp/twrvf65gs10_m4/twrvf65gs10_m4.h” 修改时钟 ------------------------ ... #define BSP_CORE_CLOCK                  (166700000) #define BSP_BUS_CLOCK                   (166700000) #define BSP_SYSTEM_CLOCK                (83300000) #define BSP_IPG_CLOCK                   (83300000) ... ------------------------ 4). 编译MQX a). 替换  “mqx/examples/hello/build/make/hello_twrvf65gs10_m4/build_gcc_arm.sh” 文件 从这里下载文件 b). 编译Helloworld Firmware ------------------------ $ cd mqx/examples/hello/build/make/hello_twrvf65gs10_m4/ $ ./build_gcc_arm.sh ... Build done Press any key to continue... ------------------------ c). 创建binary Firmware文件 ------------------------ $ cd ~/FSLMQXOS_4_1_2_Vybrid/mqx/examples/hello/build/make/hello_twrvf65gs10_m4/gcc_arm/ram_release $ export PATH=~/gcc-arm-none-eabi-4_9-2014q1/bin/:$PATH $ arm-none-eabi-objcopy -O binary hello_twrvf65gs10_m4.elf hello_twrvf65gs10_m4.bin ------------------------ d). 查看应用入口地址 由于二进制程序没有可以指明加载地址或入口地址的头部信息,因此需要在加载的时候手动添加 ------------------------ $ arm-none-eabi-objdump -f hello_twrvf65gs10_m4.elf   hello_twrvf65gs10_m4.elf:     file format elf32-littlearm architecture: arm, flags 0x00000112: EXEC_P, HAS_SYMS, D_PAGED start address 0x3f0007b1 ------------------------ e). 运行MQX 将bin文件复制到Colibri VF61 A5核心的Linux系统上面,运行下面命令启动mcc然后下载并运行MQX在M4核心 ------------------------ # modprobe mcc # mqxboot hello_twrvf65gs10_m4.bin 0x3f000000 0x3f0007b1 ------------------------ f). 查看M4串口输出 将Colibri开发板UARTB接口连接到开发主机 ------------------------ $ sudo minicom -D /dev/ttyUSB1 -d 115200 Welcome to minicom 2.7   OPTIONS: I18n Compiled on Jan  1 2014, 17:13:19. Port /dev/ttyUSB1, 14:58:22 Press CTRL-A Z for help on special keys   Hello World ------------------------ 5). GPIO demo 在M4运行MQX GPIO demo, 通过BSP_BUTTON1来控制打开和关闭BSP_LED1 a). 查看M4对应管脚定义 确定BSP_BUTTON1对应GPIO管脚为PTB16,BSP_LED1对应GPIO管脚为PTB0 ------------------------ $ vi FSLMQXOS_4_1_2_Vybrid/mqx/source/bsp/twrvf65gs10_m4/twrvf65gs10_m4.h   ... #define BSP_LED1                            (LWGPIO_PIN_PTB0) ... #define BSP_SW1                             (LWGPIO_PIN_PTB16) ... #define BSP_BUTTON1                         BSP_SW1 ... ------------------------ b). 确认M4 GPIO管脚资源 通过查询Colibri VF61手册和A5 Linux Device Tree文件, 发现PTB0被A5 Linux pwm0占用,而PTB16虽然被flexcan1占用但默认并为启用,因此首先需要根据这里的说明先重新编译A5 Linux Device Tree文件将pwm0 disable以免管脚资源冲突;然后在Colibri载板上面将PTB0 (SODIMM 59)连接到X21 LED1 (Pin 2), PTB16 (SODIMM 63)连接到X21 SW6 (Pin 11) c). 同样方法编译MQX GPIO Firmware ------------------------ $ cd ~/FSLMQXOS_4_1_2_Vybrid/mqx/examples/gpio/build/make/gpio_twrvf65gs10_m4 $ ./build_gcc_arm.sh $ cd gcc_arm/ram_release/ $ export PATH=~/gcc-arm-none-eabi-4_9-2014q1/bin/:$PATH $ arm-none-eabi-objcopy -O binary gpio_twrvf65gs10_m4.elf gpio_twrvf65gs10_m4.bin $ arm-none-eabi-objdump -f gpio_twrvf65gs10_m4.elf   gpio_twrvf65gs10_m4.elf:     file format elf32-littlearm architecture: arm, flags 0x00000112: EXEC_P, HAS_SYMS, D_PAGED start address 0x3f000e51 ------------------------ d). 部署并测试demo ./ 在VF61 A5 Linux上面部署并运行MQX GPIO到M4 ------------------------ # mqxboot gpio_twrvf65gs10_m4.bin 0x3f000000 0x3f000e51 ------------------------ ./ 在M4 串口输出打印按键3次 ------------------------ ====================== GPIO Example ====================== The (SW1) button is configured to trigger GPIO interrupt. Press the (SW1) button 3x to continue. ------------------------ ./ 按Colibri 开发板SW6 3次后,即可通过SW6控制LED1 ------------------------ Button pressed 3x   The (SW1) button state is now polled. Press the (SW1) button to switch LED on or off   Button pressed ------------------------ 6). MCC Pingpong demo 下面通过MCC Pinpong demo来测试A5和M4之间的信息传递 a). 配置MCC版本 MQX 4.1.2版本默认采用MCC V2版本,但也同时提供了V1版本源代码;由于目前VF61 Linux只支持MCC V1版本,因此首先要用V1版本源代码替换V2版本 ------------------------ $ cd ~/FSLMQXOS_4_1_2_Vybrid/mcc/source $ unzip mcc_version_1_2.zip -d ../.  //按提示选择全部替换 $ vi mcc_vf600.c //如下面红色部分修改 static const unsigned int mcc_cpu_to_cpu_vectors[] = { GIC_CPU_to_CPU_int0, NVIC_CPU_to_CPU_int0 }; ------------------------ b). 编译MCC ------------------------ $ cd ~/FSLMQXOS_4_1_2_Vybrid/mcc//build/make/mcc_twrvf65gs10_m4 $ ./build_gcc_arm.sh ------------------------ c). 编译Pingpong demo ------------------------ $ cd ~/FSLMQXOS_4_1_2_Vybrid/mcc/examples/pingpong/build/make/pingpong_example_twrvf65gs10_m4 $ ./build_gcc_arm.sh ------------------------ d). 部署运行测试Pingpong demo 和之前同样方法获得bin和入口地址,并通过A5 Linux运行到M4上面 ./ A5 Linux部署执行Pingpong demo ------------------------ $ mqxboot pingpong_example_twrvf65gs10_m4.bin 0x3f000000 0x3f001095 ------------------------ ./ 运行后, M4串口输出 ------------------------ Responder task started, MCC version is 001.002   ------------------------ ./ 然后在A5 Linux运行自带的Pingpong应用 ------------------------ mcc-pingpong ------------------------ ./ 然后M4串口输出 ------------------------ Responder task received a msg                                                   Message: Size=4, DATA = 1                                                       Responder task received a msg                                                    Message: Size=4, DATA = 3 ... ------------------------ ./ 同样A5串口输出 ------------------------ version: 001.002                                                                Message: Size=4, DATA = 2 after 0.004325 seconds.                                Message: Size=4, DATA = 4 after 0.004340 seconds.                               Message: Size=4, DATA = 6 after 0.004669 seconds. ... ------------------------ 7). 总结 本文简单展示了在VF61 M4核心上面运行MQX以及A5和M4核心通信例程,可见MQX可以非常方便的部署在NXP处理器上面,详细的MQX应用开发可以参考下面文档. FSLMQXOS_4_1_2_Vybrid/doc http://developer.toradex.com/knowledge-base/mqx-on-the-cortex-m4-of-a-colibri-vf61
  • 热度 19
    2016-2-29 20:25
    1786 次阅读|
    0 个评论
    2016年2月23号,德国纽伦堡 : Toradex 很荣幸地发布基于 NXP i.MX 7 系列处理器的系统模块新成员。该处理器具有优异的能效比、高级安全功能以及采用 ARM Cortex-A7 和 Cortex-M4 的异构多核构架。这些特性使该平台非常适合快速增长的物联网市场。   处理器新特性 :Colibri iMX7S 和 Colibri iMX7D -NXP i.MX 7Solo 和 i.MX 7Dual 处理器 -1x/2x ARM Cortex-A7 最高主频1GHz , 1x Cortex-M4 200MHz 主频 -256MB/512MB RAM, 512MB on-board Flash -非对称 / 异构多核处理 -低功耗 / 高效能 -高级安全功能 -外设接口:CAN、以太网、USB、I2C、UART 等 -多媒体:触摸、RGB、并口摄像头、模拟音频等 -温度范围:-20° 到 85° C   其中 Cortex-M4 核专为实时应用设计。该独特的异构多核架构允许将实时任务从任何服务或者用户界面相关的应用中分离出来。i.MX 7 处理器还提供诸多安全功能,例如安全启动、加密加速和篡改检测,这对物联网具有较高的价值。   Toradex 内部性能检测证实了 i.MX 7 处理器所采用构架的高效性。在具有和 i.MX 6Solo (ARM Cortex-A9 1GHz)相近的性能下,其运行功耗却同 Colibri VF61 (ARM Cortex-A5 500MHz) 相当,低于 i.MX 6Solo 75% 的功耗。在空闲模式下, i.MX 7功耗甚至比 i.MX 6Solo 少三分之一。 *测试结果基于 nbench 性能测试工具,其使用单核计算,所以 双核 i.MX 7Dual 和 单核 i.MX 6Solo, VF61 VF50 的性能和功耗数据具有可比性。   Colibri iMX7S/D 扩展了Toradex 稳健、紧凑型嵌入式计算机模块和可定制化单板电脑,其可以应用于众多行业,如工业自动化、医疗、汽车、机器人以及其他领域。Toradex 的产品是快速进行产品概念验证以及从原型到大规模量产无缝迁移并且无需重新设计的理想选择。   "我们很荣幸地成为全世界少数 的几个公司能够提供基于 NXP i.MX 7 系列处理器的产品。该处理器为基于 VFxx 引脚兼容平台提供升级方案,于此同时,继续在同一个芯片上保持两种不同内核独特的组合。通过使用 Cortex-M4 控制传感器和运动执行器,Cortex-A7 运行非实时任务,用户可以极大地降低系统复杂度和 BOM 成本。该产品是 Toradex 和 NXP 之间长久和牢固合作伙伴关系的成果",Toradex CEO Stephan Dubach 提到。   i.MX 应用 CEA Robert Thompson :"NXP 一直致力于扩展 i.MX7 应用,我们合作伙伴提供的板级系统设计,使得我们的用户能够有效地缩短产品上市时间。Toradex 的 i.MX7 是一个非常高效、强劲的系统模块,采用紧凑封装,提供诸多安全功能。该系统模块依附广泛的生态系统,用户能够快速启动产品研发,缩短产品上市时间"。   技术详细参数 Colibri iMX7 系统模块技术参数说明 https://www.toradex.com/computer-on-modules/colibri-arm-family/nxp-freescale-imx7 .   上市时间 Toradex Colibri iMX7 系统模块将于 2016年3 月上市。   网络研讨会议 Toradex 将在 2016 年 3 月 9 日,同 NXP 一起举行网络研讨会议。现在注册:i.MX7 产品介绍 – Toradex 和 NXP 主讲。
  • 热度 24
    2016-1-29 15:40
    1192 次阅读|
    0 个评论
    启动画面(Splash Screen)是指在Linux启动时候显示的图片,通常默认情况下Linux只是输出一些传统的小企鹅图标和启动Console命令行,但嵌入式设备都需要定制自己开机画面,这里就以 Toradex ARM计算机模块 及其发布 Linux 为例对ARM Linux更新启动画面做说明。 1). 配置 开发主机:Ubuntu 14.04 X86_64 目标板:Toradex ARM 计算机模块及自带的Embedded Linux   2). 准备 下载Toradex Embedded Linux 源码包 请按 这里 说明如何下载及编译Kernel内核 安装相关软件包 ---------------------------------------------------------------------------- $ sudo apt-get install gimp $ sudo aptget install tgif xfonts-100dpi xfonts-75dpi ----------------------------------------------------------------------------   3). 创建原始启动画面图片 根据自己的需要利用gimp工具创建合适分辨率的图片,详细说明请见 这里 。这里将做好的图片命名为“toradexlogo_1024x600.ppm”   4). 修改图片颜色和编码 ---------------------------------------------------------------------------- $ ppmquant 224 toradexlogo_1024x600.ppm toradexlogo_1024x600_224.ppm $ pnmnoraw toradexlogo_1024x600_224.ppm toradexlogo_1024x600_ascii_224.ppm ----------------------------------------------------------------------------   5). 将最终图片改为系统默认名字后放置于源码目录下对应位置 ---------------------------------------------------------------------------- $ cp toradexlogo_1024x600_ascii_224.ppm logo_custom_clut224.ppm $ mv logo_custom_clut224.ppm linux-kernel/drivers/video/logo/ ----------------------------------------------------------------------------   6). 修改编译配置文件 a). linux-kernel/drivers/video/logo目录里面需要修改Kconfig,Makfile和logo.c,如默认已经添加则无需修改。 ./  Kconfig 文件添加下面内容 ---------------------------------------------------------------------------- config LOGO_CUSTOM_CLUT224         bool "Custom 224-color Linux logo"         default n ---------------------------------------------------------------------------- ./ Makefile文件添加下面内容 ---------------------------------------------------------------------------- obj-$(CONFIG_LOGO_CUSTOM_CLUT224)       += logo_custom_clut224.o ---------------------------------------------------------------------------- ./ logo.c文件添加下面内容 ---------------------------------------------------------------------------- #ifdef CONFIG_LOGO_CUSTOM_CLUT224                 /* Custom Linux logo */                 logo = logo_custom_clut224; #endif ---------------------------------------------------------------------------- b). linux-kernel/include/linux/目录里面,修改linux_logo.h,如默认已经添加则无需修改。 ./ linux_logo.h文件添加下面内容 ---------------------------------------------------------------------------- extern const struct linux_logo logo_custom_clut224; ----------------------------------------------------------------------------   7). 重新编译内核 详细说明请参考这里,这里以 Colibri Vybrid 产品为例,其他模块需改为对应参数。 a). 安装交叉编译Tool Chain,请从 这里 下载 ---------------------------------------------------------------------------- $ tar xvf gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf.tar.xz $ ln -s gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf gcc-linaro ---------------------------------------------------------------------------- b). 配置环境变量 ---------------------------------------------------------------------------- $ export ARCH=arm $ export PATH=~/gcc-linaro/bin/:$PATH $ export CROSS_COMPILE=arm-linux-gnueabihf- ---------------------------------------------------------------------------- c). 生产并修改config文件 ---------------------------------------------------------------------------- $ make colibri_vf_defconfig        //生成默认.config文件 $ make menuconfig        // 进入Device Drivers - Graphics support - Bootup logo - 选择 "Custom 224-color Linux logo"之后保存。 ---------------------------------------------------------------------------- d). 编译新的kernel image ---------------------------------------------------------------------------- make -j3 zImage | tee build.log ----------------------------------------------------------------------------   8). 部署新的 image a). 按如下方法,将原标准 Linux image 中的zImage替换为新的定制启动画面的zImage ---------------------------------------------------------------------------- $ cp zImage zImage_custom $ sudo mv zImage_custom Colibri_VF_LinuxImageV2.x/rootfs/boot/ $ ln -fs /boot/zImage-custom zImage ---------------------------------------------------------------------------- b). 按照这里的方法将新的image刷写到目标板   9). 配置目标板 进入uboot,修改下面uboot环境变量,然后重启就可以了 ---------------------------------------------------------------------------- $ setenv setup 'setenv setupargs vt.global_cursor_default=0 console=${console},${baudrate}n8 ${memargs} consoleblank=0' ----------------------------------------------------------------------------
  • 热度 33
    2016-1-21 17:09
    1212 次阅读|
    0 个评论
    实时调度机制(Real-Time Scheduler)是Windows Embedded Compact区别于其他所有Windows系统的最显著特性,同时也是开发嵌入式系统时需要着重考虑的部分。在工程领域对“实时”的理解,我非常欣赏下面的定义: “一个实时系统必须要满足明确的(受限的)响应时间约束或风险的严重后果,包括失效状态” - 出自于Phillip A. Laplante 《Real-Time System Design and Analysis》 所以,一个实时系统中执行一个代码必须在规定的时间约束内有明确的结果,否则就可能会导致系统失效,实时并不一定意味着快速处理能力。 而Windows Embedded Compact正符合上述对于实时系统的定义,因此为了进一步理解,我们首先来了解它的任务调度机制,WinCE的任务调度内核每隔1ms查询一次现有任务并依据下面两个原则来决定处理哪个任务: a). 具有更高优先级的任务先被执行 b). 同样优先级的任务按100ms时间间隔(或Task Quantum定义的时间间隔)循环轮流执行 对于第一条规则,WinCE提供256个优先级等级(0-255),数字越小优先级越高,因此0级为最高优先级,关于优先级的应用本文不做重点描述,请参考下面文章: Real-Time Priority System Levels (Windows Embedded CE 6.0) 对于第二条规则,当多个待处理任务拥有同样的优先级,将按照100ms时间间隔(可以根据Thread Quantum自定义)循环轮流执行。例如有N个同样优先级的任务,当第一个运行了上述定义时间片(WinCE称其为Quantum,如100ms),系统内核就会将其中断然后执行第二个任务,依此类推,直到N个任务都执行过一个Quantum时间后再重新回到第一个任务执行,如此循环。任一个线程最多只能运行一个Quantum的时间,除非另一个更高优先级的任务需要占用CPU,则按照第一条规则,这个线程会被更高优先级任务占用。   下面我们通过两个例子来验证上述两个规则,硬件平台使用 Toradex Colibri VF61 (NXP/Freescale Vybrid Cortex-A5 )计算机模块搭配 Iris 载板 ,软件使用Toradex提供的对应此平台的工业级的 WinCE6 OS 和 GPIO 库 。 a). 软硬件平台搭建请参考开发指南,如下图所示 b). 验证原理为在系统中启动两个任务,第一个任务驱动硬件某个GPIO输出为低电平,而另一个则将同一个GPIO输出为高电平;再将这两个任务的优先级分别设置为相同和不同时候,通过观测GPIO连接的示波器输出来判定上述的两个调度规则。关键代码如下:创建两个线程入口函数ThreadON和ThreadOFF,分别用来将选定的GPIO输出为高电平和低电平,而从函数内部代码可见会持续输出高电平或者低电平,因此我们通过示波器观察GPIO管脚的输出即可得出目前是哪个函数在运行。 -------------------------------------------------------------------------------------------------------------- #include windows.h #include "gpio.h"   // === define constant pins / gpios === // SODIMM pin 101 uIo io1 = COLIBRI_PIN(101); HANDLE hGpio; HANDLE hThreadON, hThreadOFF;   //define ThreadON DWORD WINAPI ThreadON ( LPVOID lpParam ){      //Set Thread Priority      CeSetThreadPriority(GetCurrentThread(), 100);      Sleep(5); //Allow the orther Thread to configure it's PRIO      //FNFINITE LOCKING LOOP      while(1){          //Set GPIO logic high          Gpio_SetLevel(hGpio, io1, ioHigh);      }      return 0; } //define ThreadOFF DWORD WINAPI ThreadOFF ( LPVOID lpParam ){      //Set Thread Priority      CeSetThreadPriority(GetCurrentThread(), 100);      //FNFINITE LOCKING LOOP      while(1){          //Set GPIO logic low          Gpio_SetLevel(hGpio, io1, ioLow);      }      return 0; } //============================================================================= // Application Entry Point // // The simple error handling using ASSERT statements is only effective when // the application is run as a debug version. //============================================================================= int wmain(int argc, _TCHAR* argv[])   {     BOOL success;     // === Initialize GPIO library. ===     // We don't use registry-based  configuration, thus we can     // pass NULL go Gpio_Init()     hGpio = Gpio_Init(NULL);       ASSERT(hGpio != 0);     success = Gpio_Open(hGpio);     ASSERT (success);     // Configure the pin to act as GPIO (as opposed to an Alternate function)     // Set it to Output,  High     Gpio_ConfigureAsGpio(hGpio, io1);     Gpio_SetDir         (hGpio, io1, ioOutput);     Gpio_SetLevel       (hGpio, io1, ioHigh);       CeSetThreadPriority(GetCurrentThread(), 99);      //Create two concorrent Threads, one set GPIO to High and other to Low      hThreadON = CreateThread(NULL, 0, ThreadON, NULL, 0, NULL);     hThreadOFF = CreateThread(0, 0, ThreadOFF, NULL, 0, NULL);     //Time to finish the Program Sleep(3000);       return(TRUE); } -------------------------------------------------------------------------------------------------------------- c). 首先我们来测试第二条规则,将两个任务的优先级设置为相同值(如上面代码为100),运行程序后示波器图形如下,可以看到每隔100ms GPIO输出循环交替变化,完全符合我们第二条规则。 d). 然后我们再来测试第一条规则,如下修改一个任务(ThreadON)的代码,将其优先级提高到99,另外在循环中增加一个5ms的暂停时间。 -------------------------------------------------------------------------------------------------------------- DWORD WINAPI ThreadON ( LPVOID lpParam ){      //Set Thread Priority      CeSetThreadPriority(GetCurrentThread(), 99);      Sleep(5); //Allow the orther Thread to configure it's PRIO      //FNFINITE LOCKING LOOP      while(1){          //Set GPIO logic high          Gpio_SetLevel(hGpio, io1, ioHigh);                 Sleep(5);      }      return 0; } -------------------------------------------------------------------------------------------------------------- e). 运行修改后的程序,示波器输出如下结果,每隔7ms左右有一个拉高的脉冲,表示每次当高优先级的任务(ThreadON)从5ms 暂停时间恢复后,都会中断低优先级任务的执行,这样完全符合第一条规则的描述。   当然,以上所有测试都是基于单核心系统,从Windows Embedded Compact 7 开始,WinCE内核提供了对多核心处理器的支持,同时也有一个新的属性“affinity”来定义哪一个核心来执行哪一个线程,所以如果在多核系统和WEC7上面运行上述例子,同时并未限定线程在同一个核心上面执行,则结果会不同因为两个线程会同时在不同核心上面运行。当然,其实正常应用情况下我们是不建议设置“affinity”参数的,因为这样就无法使得内核调度来自动安排线程在最先空闲的核心上面运行,达不到降低延迟提高系统性能的要求了。 实时系统目前在包括工业自动化,机器人和医疗领域等嵌入式设备上面有广泛的需求,因此了解WinCE的实时调度工作机制以及如何使用线程可以让我们的应用程序实时稳定的执行,让我们更高效可靠的利用WinCE搭建我们的实时系统!