|
【RT-Thread读书笔记】第一部分 裸机与系统
[复制链接]
本帖最后由 cxzs1234 于 2019-4-27 14:09 编辑
这不是我第一次使用实时操作系统(RTOS),但绝对是我最用心的一次去学习、去理解、去使用一个RTOS。第一次使用的是ucOSII,只用它做过一个课程设计,大概了解了RTOS的原理,第二次是使用Free RTOS,是公司的一个项目上用到,就学习了一下,对RTOS有了进一步的了解,但是只是在别人的实例工程基础上自己掌握了创建任务、信号量、事件功能,其他的没用用到,自然也不想去理解了,给我的印象是简单好用。在半年前看到这个国产操作系统RT-Thread,自己才有印象好像以前有同学介绍过,让我去了解一下,但是当时感到这个不是很成熟同时自己也用不上就没有去查阅过,只知道是一个国产的操作系统。去年的中兴事件给我很大的影响,我们现在至少在科技领域我们还大大的落后于欧美国家,他们随时可以那这些东西去威胁中国,届时我们可真的就束手无策了。因为你用的电脑CPU就是美国的,操作系统也是美国的,没有这些我们岂不是倒退到十年前。所以我就下决心在以后的生活中尽量的支持国产的产品,现在就从这个我能切实的应用到产品的RT-Thread开始吧。
先说说<>这本书,这本书是本不错的工具书,从最底层的源码开始介绍介绍RT-Thread的运行机制,这对想了解RTOS运行机制的人来说是很重要的知识,里面都是纯干货,需要耐住性子去理解,相信看完之后不仅是对RTOS的原理了如指掌,而且对C语言的编程技巧也是大有裨益的,对于一个从裸机过来的人来说C语言不再是for(;;)、if() else、 while() 、 switch()这些基本的语句就能构成我们程序的全部了,你会有更好的理解嵌入式C语言更深层的东西。但是这是对想了解RT-Thread原理的人来说是福音,但是只是对马上就使用RT-Thread运行起来的人或者了解过其他RTOS运行机制的人来说,可以直接看第二部分了。毕竟官方的视频教程和和就是直接讲的直接介绍RT-Thread的各个组件的应用,而不是直接讲解内核源代码。在这本书的第一章也介绍了我上述的观点。我是先将官方的视频教程看了个遍在看这本书的,这样更有助于自己的理解。 第四章讲的是使用MDK建立一个工程,可谓是入门的第一步,搭建好自己的开发环境,做好学习的准备工作。我的建议是能够在以自己的开发板基础上建立一个工程,便于我们能够直接观察到实验的现象,使用软件仿真有一个不好的地方,比如我们定时的一秒动作一个IO口,实际上可能要等上好几秒才能动作,毕竟是软件仿真,时间肯定不精确。便宜的STM32三件套也就是十几块钱,比软件仿真更有意义。后记:在今天中午的时候,自己在搭建后STM32F051的开发环境的时候使用软件仿真一下,看能不能直接启动起来时,遇到一个错误*** error 65: access violation at 0x40021000 : no 'write' permission。后来看到网上说是将Dbug选项中的Dialog DLL更换为DARMSTM,Parameter换为自己的型号就行了。但是还是不行,最后才看到官网上说:STM32里面只支持F1,其他的可以放弃软件仿真了。(http://www.keil.com/support/docs/3726.htm...Visio)。
第五章介绍裸机和线程系统,如果是实现较单一的设计时还是使用裸机好的,只要明确程序设计的流程和逻辑就行,不一定要用RTOS,我们在设计产品的时候还要考虑实际的需求,比如1块钱的单片机就能够解决实际问题的,我们却要花几倍价钱的单片机上实现一个RTOS。关于裸机程序时候我给大家一个建议,怎样简化程序逻辑的方法,我最开始的时候是学FPGA的,后来回到家乡后这玩意彻底没有用处了,但是有一点挺有用的就是状态机,我们把设计的产品要实现的功能逻辑梳理一下,使用状态机在不同的状态和条件下切换执行的任务中,可以简化我们的思维增加可读性。简单的写个框架吧,不一定适用于各种情况。
for(;;)
{
currentStatus = nextStatus;//有时候需要根据上一状态决定下一状态,所以有两个状态,当然只有一个也行。
switch(currentStatus)
{
case work1 : dosomething() ;
if(eventA) nextStatus = work2;
else nextStatus = work3;
break;
case work2 : dosomething() ;
if(eventB) nextStatus = work3
else nextStatus = idle;
break;
case work3 : dosomething() ;
nextStatus = idle;
break;
case idle: dosomething() ;
if(eventC) nextStatus = work1;
nextStatus = idle;
break;
default : nextStatus = idle;
}
}
看到这个,我果然还是个利用最简单的C语法编程的人,菜鸟一个,我也需要一些高级的C编程方法啊。
多线程系统,也正是我们要学习的重点。看到第五章时候,多线程我给我理解的就是各个任务独立,互不干扰,无限循环,具备优先级,还有系统去调度。对于任务独立和互不干扰来说,有点不对,任务之间是有联系的,比如信号量邮箱这些东西不就是任务与任务之间的联系纽带么?无限循环在RT-Thread中是不一定的,任务可以运行一遍就结束了,而且可以直接return,在freeRTOS中好像是个无限循环。可能作者是针对当前的例程来说吧,我有点钻牛角尖了。
此内容由EEWORLD论坛网友cxzs1234原创,如需转载或用于商业用途需征得作者同意并注明出处
|
|