入门物联网操作系统(上)

来源 :电脑报 | 被引量 : 0次 | 上传用户:feixubushi
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  一般嵌入式操作系统因为它的特殊性,往往和硬件平台密切相关,具体的嵌入式操作系统往往只能在特定的硬件上运行。对于刚接触 RT-Thread 操作系统的读者来说并不容易马上就获得一个和 RT-Thread 操作系统相配套的硬件模块,但随着计算机技术的发展,我们可以采用软件方式来模拟一个能够运行 RT-Thread 操作系统的硬件模块,这就是 ARM 公司的 MDK-ARM 仿真模拟环境。
  MDK-ARM(MDK-ARM Micro
  controller Development Kit)軟件是一套完整的集成开发环境(IDE),它出自 ARM 公司,包括了针对 ARM 芯片(ARM7、ARM9、Cortex-M 系列、Cortex-R 系列等)的高效 C/C++ 编译器;针对各类 ARM 设备、评估板的工程向导、工程管理;用于软件模拟运行硬件平台的模拟器;以及与市面上常见的如 ST-Link、JLink 等在线仿真器相连接以配合调试目标板的调试器。MDK-ARM 软件中的软件仿真模拟器,采用完全软件模拟方式解释执行 ARM 的机器指令,并实现外围的一些外设逻辑,从而构成一套完整的虚拟硬件环境,使得用户能够不借助真实的硬件平台就能够在电脑上执行相应的目标程序。
  MDK-ARM 集成开发环境因为其完全的 STM32F103 软件仿真环境,也让我们有机会在不使用真实硬件环境的情况下直接在电脑上运行目标代码。这套软件仿真模拟器能够完整地虚拟出 ARM Cortex-M3 的各种运行模式、外设,如中断异常、时钟定时器、串口等,这几乎和真实的硬件环境完全一致。实践也证明,本文使用到的这份 RT-Thread 入门例程,在编译成二进制代码后,不仅能够在模拟器上实现软件模拟运行,也能够不需要修改而在真实硬件平台上正常运行。
  下面我们将选择 MDK-ARM 集成开发环境作为目标硬件平台来观察 RT-Thread 操作系统是如何运行的。
  一、准备工作
  MDK 开发环境:需要安装 MDK-ARM 5.24 (正式版或评估版,5.14 版本及以上版本均可),这个版本也是当前比较新的版本,它能够提供相对比较完善的调试功能。安装方法可以参考Keil MDK安装。
  Keil MDK安装链接:
  https://www.rt-thread.org/docum
  ent/site/tutorial/quick-start/keil/keil/
  二、初识 RT-Thread
  作为一个操作系统,RT-Thread 的代码规模怎么样呢?我们找到RT-Thread压缩包文件,将它解压,我们这里解压到 D盘,解压完成后的目录结构如图1所示:
  各个目录所包含的文件类型的描述如图2所示:
  在目录下,有一个 project.uvprojx 文件,它是本文内容所引述的例程中的一个 MDK5 工程文件,双击 “project.uvprojx” 图标,打开此工程文件(图3):
  在工程主窗口的左侧 “Project” 栏里可以看到该工程的文件列表,这些文件被分别存放到如下几个组内,分别是(图4):
  现在我们点击一下窗口上方工具栏中的按钮,对该工程进行编译,如图5所示:
  编译的结果显示在窗口下方的 “Build” 栏中,没什么意外的话,最后一行会显示“0 Error(s), * Warning(s).”,即无任何错误和警告。
  在编译完 RT-Thread/STM32 后,我们可以通过 MDK-ARM 的模拟器来仿真运行 RT-Thread。点击窗口右上方的按钮或直接按 “Ctrl+F5” 进入仿真界面,再按 F5 开始运行,然后点击该图工具栏中的按钮或者选择菜单栏中的 “View→Serial Windows→UART#1”,打开串口 1 窗口,可以看到串口的输出只显示了 RT-Thread 的 LOGO,这是因为用户代码是空的,其模拟运行的结果如图6、7所示:
  三、系统启动代码
  一般了解一份代码大多从启动部分开始,同样这里也采用这种方式,先寻找启动的源头。以 MDK-ARM 为例,MDK-ARM 的用户程序入口为 main() 函数,位于 main.c 文件中。系统启动后先从汇编代码 startup_stm32f103xe.s 开始运行,然后跳转到 C 代码,进行 RT-Thread 系统功能初始化,最后进入用户程序入口 main()。
  下面我们来看看在 components.c 中定义的这段代码:
  1//components.c中定义
  2/*re-define main function */
  3int $Sub$$main(void)
  4{
  5rt_hw_interrupt_disable();
  6rtthread_startup();
  7return 0;
  8}
  在这里$Sub$$main函数仅仅调用了rtthread_startup()函数。RT-Thread 支持多种平台和多种编译器,而rtthread_startup()函数是 RT-Thread 规定的统一入口,所以$Sub$$main函数只需调用rtthread_startup()函数即可。例如采用 GNU GCC 编译器编译的 RT-Thread,就是直接从汇编启动代码部分跳转到rtthread_startup()函数中,并开始第一个 C 代码的执行的。在 components.c 的代码中找到rtthread_startup()函数,我们将可以看到 RT-Thread 的启动流程:   1int rtthread_startup(void)
  2{
  3rt_hw_interrupt_disable();
  4
  5/*board level initalization
  6*NOTE:please initialize heap inside board initialization.
  7*/
  8rt_hw_board_init();
  9
  10/*show RT-Thread version?*/
  11 rt_show_version();
  12
  13/*timer system initialization*/
  14rt_system_timer_init();
  15
  16/*scheduler system initializati on*/
  17rt_system_scheduler_init();
  18
  19#ifdef RT_USING_SIGNALS
  20/*signal system initialization */
  21rt_system_signal_init();
  22#endif
  23
  24/* create init_thread */
  25rt_application_init();
  26
  27/* timer thread initialization*/
  28rt_system_timer_thread_init();
  29
  30/* idle thread initialization*/
  31rt_thread_idle_init();
  32
  33/* start scheduler */
  34rt_system_scheduler_start();
  35
  36/* never reach here */
  37return 0;
  38}
  這部分启动代码,大致可以分为四个部分:
  初始化与系统相关的硬件;
  初始化系统内核对象,例如定时器、调度器;
  初始化系统设备,这个主要是为 RT-Thread 的设备框架做的初始化;
  初始化各个应用线程,并启动调度器。
  四、用户入口代码
  上面的启动代码基本上可以说都是和 RT-Thread 系统相关的,那么用户如何加入自己的应用程序的初始化代码呢?RT-Thread 将 main 函数作为了用户代码入口,只需要在 main 函数里添加自己的代码即可。
  1int main(void)
  2{
  3/* user app entry*/
  4return 0;
  5}
  ARM教程链接:
  http://infocenter.arm.com/help/index.jsp topic=/com.arm.doc.dui0377g/pge1362065967698.html
  五、跑马灯的例子
  对于从事电子方面开发的技术工程师来说,跑马灯大概是最简单的例子,就类似于每种编程语言中程序员接触的第一个程序 Hello World 一样,所以这个例子就从跑马灯开始。让它定时地对 LED 进行更新(关或灭)。
  我们 在UART#1 中输入 msh 命令:led 然后回车就可以运行起来了,如图8所示:
  六、跑马灯例子
  1/*
  2*程序清单:跑马灯例程
  3*
  4*跑马灯大概是最简单的例子,就类似于每种编程语言中程序员接触的第一个程序
  5*Hello World 一样,所以这个例子就从跑马灯开始。创建一个线程,让它定时地对
  6*LED进行更新(关或灭)
  7*/
  8
  9int led(void)
  10{
  11 rt_uint8_t count;
  12
  13rt_pin_mode(LED_PIN,PIN_MODE_OUTPUT);
  14
  15for(count=0;count<10;count++)
  16{
  17rt_pin_write(LED_PIN,PIN_HIG
  H);
  18rt_kprintf(“led on,count:%d”,count);
  19rt_thread_mdelay(500);
  20
  21rt_pin_write(LED_PIN,PIN_LO
  W);
  22rt_kprintf(“led off
  ”);
  23rt_thread_mdelay(500);
  24}
  25return 0;
  26}
  27MSH_CMD_EXPORT(led,RT-Thread first led sample);
  七、常见问题
  出现如下编译错误
  1rt-threadsrckservice.c(823):error:#929:incorrect use of vaarg fieldwidth=aarg(args,int);
  2rt-threadsrckservice.c(842):error:#929:incorrect use of vaarg precision=aarg(args,int);
  3………
  原因:这类问题基本上都是因为安装了 ADS 导致,ADS 与 keil共存,va_start 所在的头文件指向了 ADS 的文件夹。
  八、解决办法
  1.删除 ADS 环境变量;
  2.卸载 ADS 和Keil,重启电脑,重装Keil。
其他文献
随着网络社会的发展变迁,很多传统纸媒的读者群体开始逐渐从纸质阅读转为移动端阅读,而我们的电脑报也顺应了这一发展趋势,成立了新媒体部门。  从最开始的微信公众号的创建,再到后来斗鱼平台电脑报官方账号的开播,我们给粉丝读者以及观众群体提供了更多丰富有趣的科技内容。区别于传统纸媒的是,通过新媒体来对各种科技信息的呈现,使得我们提供给读者以及观众的内容表达形式更加多样化,也拉近了电脑报和粉丝的距离,相关的
期刊
继中兴、华为之后,又一家手机厂商的5G商用手机细节信息被曝光。7月26日晚,iQOO的5G手机被一些平台的广告位展出。考虑到iQOO官方已经高调宣布自家5G手机已经完成了“三证齐全”,并且宣布会在今年第三季度上市,因此本次提前偷跑的宣传广告可信度极高。  根据曝光的宣传海报显示,iQOO的5G手机被命名为iQOO Plus 5G,将搭载高通骁龙855 Plus旗舰平台,辅以8GB+128GB存儲组
期刊
一周又过去啦,大家有在师姐(微信:yhmd0808)这里买到什么优惠好物吗?接下来跟着师姐来看看本周又有哪些反馈比较好的单品吧!打个广告,师姐的8月福利活动马上就开始啦,小可爱们快来加师姐微信参加呀,奖品大放送一波!  山本空气炸锅  空气炸锅也是师姐前段时间才Get到的单品,一开始我对这个东西还抱有怀疑态度,毕竟不放油就能做出油炸的口感,听起来真的不靠谱呀!用了之后才发现真香,嘻嘻。它的原理是利
期刊
一、Hello,world!  使用win32com需要安装pypiwin32  pip install Pypiwin32  推荐使用python的IDLE,交互方便  1.如何新建文档  按F5运行,发现什么效果都没有, 这是因为Word被隐藏了。  2.如何显示Word  app.Visible = 1  运行后,熟悉的Word界面出现。现在来输入文字。  3.如何输入  我们在Word中输
期刊
小米手環4
期刊
热!热!热!  燥热的盛夏,要是手边没有一杯冰镇饮料,感觉一整天都会奄奄一息…… 而只要有一瓶冰阔落,就能让Q妹儿瞬间满血复活,快快乐乐地追剧,对了,你看《亲爱的,热爱的》这部剧了吗?  讲真的,在夏天,冰块、空调和电视剧是我绝对的真爱。当Q妹儿在家自己冻冰块时,不是水灑了,就是冰箱里没有适合放冰格的空间,开放式的冰格也不那么卫生,总感觉串味了。即使冻好了冰块呢,也不那么满意!加了冰的饮料虽然喝着
期刊
4.机制  4.1 视觉体验优化  ★ 4.1.1 基于知识图谱的标准类目扩展  受种种因素制约,商品类目体系过于细致,不符合推荐场景中用户对商品的主观分类。知识图谱团队可以建立标准类目体系,从语义层面出发,结合场景的特点,将相近的叶子类目进行不同程度的聚合,分别应用在购买类目过滤和类目打散时的类目扩展。  ★ 4.1.2 基于图像指纹的相似图片检测系统  商品素材浩如烟海,相似的展示图片层出不穷
期刊
破壁机到底是什么时候流行起来的?这得从2008年说起,台湾吴永志出版的《不一样的自然养生法》。他在书中称自己一度得了肺癌,践行“生机饮食”,吃各种生食、蔬果汁,癌症竟然不药而愈。  “生机饮食”是啥呢?就是要用“三匹马力”(大陆版本是2200W)以上的蔬果机,把蔬菜水果连同表皮、种子一起打碎,击破细胞膜,才能把细胞里的“植物生化素”打出来。这种带有生化素的蔬果汁,能达到延年益寿,返老还童的功效。而
期刊
服役近40年的邮政编码或将迎来退役时刻。最近,国家邮政局提出了“新型邮编”建设,未来每个人都可以建立统一且唯一的“个人地址ID(唯一编码)”,每个快递包裹也将有属于自己的ID,该ID可关联所有与包裹相关的信息,包括快递员信息、运送信息、配送信息等。并且“新型邮编”系统建成后,个人可利用身份证等信息注册个人地址ID。业内人士分析,新型邮编的建立可以更好地统一企业间的数据信息,并极大降低成本。  也正
期刊
近日,微软发布了Windows 10新版本,版本号是Build 18362.267,有趣的是,它是跟适用于Windows 10 May 2019(Version 1903)的2019年7月第二个累积更新KB4505903一起发布。  Windows 10目前最新的正式版是v1903,也就是2019更新五月版,大版号是Build 18362。日前发布的Build 18362.267是一个可选更新,除
期刊