dong2213dong

  • 2019-12-09
  • 加入了学习《EEWorld感谢有你抽奖视频》,观看 抽奖

  • 2019-11-04
  • 回复了主题帖: 为什么开源硬件需要开源软件

    前几天,安装了5.1.4体验了一下,感觉还不错

  • 2019-10-18
  • 回复了主题帖: 周五了。来一个小推理

    986

  • 2019-08-17
  • 回复了主题帖: 算法之美

    看一看 有那些算法

  • 2019-05-08
  • 发表了主题帖: 【RT-Thread】读书笔记(3)临界段保护、对象、容器

    本帖最后由 dong2213dong 于 2019-5-8 17:31 编辑       一、临界段保护 临界段指的是一段执行中不能被中断的代码段,这个临界段最常出现的就是对全局变量的操作,这里简单记录一下原因,比如两个线程均会操作同一个全局变量,假如当一个线程操作该全局变量的过程中发生系统调度,另一个线程得以执行,这个线程执行的过程中也要操作这个全局变量,这样也就是说该全局变量的值在第二个进程执行后发生了变化,与第一个线程执行时预计得到的值已经不一样了,当第一个线程再次被调度后,继续对全局变量操作就很可能会出问题了,所以说对这个全局变量的操作代码段就是临界段代码段,那么临界段保护,顾名思义就是保护临界段代码段执行过程中不被打断,除了举例说明中的发生系统调度,另外一个会影响到临界段的就是中断,因为中断也是随时发生的,但系统调度的产生本质上也是发生了中断才会发生,所以问题就统一了,要实现临界段保护只要在执行临界段代码之前将中断关闭,临界段代码执行完毕后打开中断就可以了,我们用到的MCU都会有关闭中断的指令,但是是不是简单的每次执行临界段代码关闭中断执行完毕后开启中断呢?并不是这样,实际情况要稍复杂一些,那就是要考虑临界段的嵌套。怎样解决这个问题呢,办法就是进入临界段代码之前,保存当前中断状态(开启or关闭)然后关闭中断,退出临界段代码后,不是直接开启中断,而是将中断寄存器的状态恢复成进入临界段之前的状态,这样,如果进入临界段之前中断就是关闭的,那退出临界段之后恢复中断状态,就仍然是关闭状态,这样就解决了临界段嵌套的问题(当然临界段有几层嵌套就需要几个变量保存中断状态)。中断的开启和关闭代码是汇编语言实现的,代码就没必要贴了。       二、对象 书中这样说明:在RT-Thread中,所有的数据结构都称之为对象。这个其实自己有点疑惑就是这个“数据结构”,而且目前自己也不太理解RT-Therad中为什么用“对象”这个词,如果这个“对象”是来源于向对象程序语言中的“对象”的话,按照我自己的理解,在面向对象程序语言中“对象是类的实例化”,而“类”可以理解为一种数据类型(因为有的书中就是从C语言的结构体过渡到类的,类不过是引入了函数的结构体,所以书中的解释“所有的数据结构称之为对象”,那这个数据结构是指的构造类型,还是构造类型定义出的实际变量呢?。。。不过书中又有对象数据类型,这样说的话,对象还是可以不严谨的理解为构造类型了,那我理解这里的对象不过是引入的一个名词罢了)       三、容器 书中说容器本质上就是一个数组,所以这就没什么难理解的了,而且从字面意义也能差不多猜出来,但是书中有这样一段文字,在rtt中,每当用户创建一个对象,如线程(这个地方也是上面我疑惑的“数据结构”,按照理解线程是一个函数,也就是一段程序代码,这个也可以称为数据结构。。。),就会将这个对象放到一个叫做容器的地方,:faint: :faint: :faint:,那这样的话“对象”就是一个实实在在占用内存空间的东西了,好吧,知识有限,脑袋有点折腾不过来了,先留个标记,知道有这么回事,像书中所说:目前,我们只需要知道所有创建的对象都会被放到容器中即可。后面再慢慢理解吧 此内容由EEWORLD论坛网友dong2213dong原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2019-05-05
  • 发表了主题帖: 【RT-Thread读书笔记】(2)线程栈初始化、就绪列表及调度器

          一,线程栈初始化               在线程初始化中,其中有一步是进行线程栈的初始化,线程栈是单片机RAM中的一段连续的内存空间(全局数组),那么对线程栈的初始化显然就是对一段连续的内存空间赋初使值,线程栈的初始化是利用rt_hw_stack_init()来完成的,需要说明的是,线程栈中存放的数据并不是随机的杂乱无章的,而是按照严格的位置存放CPU各个寄存器的值,因为这些值在线程从非运行态恢复到运行态时,是要依次恢复给CPU的寄存器的,具体的存放方式是从栈顶开始,首先是异常发生时自动保存的8个寄存器(xPSR,R15,R14,R12,R3,R2,R1,R0),剩下的是8个需要手动加载到CPU寄存器的参数(R4-R11),书中写这几个寄存器的初始值被默认初始化为0xdeadbeef,至于为什么是这个值,书中没做解释,也暂时不做深究。另外就是xPSR寄存器的第24位必须设置成1(指示MCU是处于ARM状态还是Thumb状态)。        二,就绪列表 就绪列表实际是一个数组,里面的存放的数据是rt_list_t类型的,数组的大小由表示最大线程优先级的的宏RT_THREAD_PRIORITY_MAX决定,RT_THREAD_PRIORITY_MAX默认定义为32,数组下标与线程的优先级是想对应的。将线程插入到就绪列表是通过将线程控制块的tlist节点插入到就绪列表中,插入到就绪列表的线程系统随时可以调用。        三,调度器 调度器作为操作系统的核心,主要功能就是实现线程的切换,也就是从就绪列表中找到优先级最高的线程,线程的切换代码主要是用汇编语言编写的,主要原理就是保存当前线程的参数到线程栈中,然后将要运行的线程的参数从线程栈恢复到MCU的寄存器,然后继续运行。 此内容由EEWORLD论坛网友dong2213dong原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2019-04-24
  • 发表了主题帖: 【RT-Thread读书笔记】(1)线程的初始化以及链表

    本帖最后由 dong2213dong 于 2019-4-25 21:23 编辑     上一篇笔记中介绍了线程、线程栈、线程控制块的概念,线程是处理具体事件的一段程序代码(函数)、线程栈用来保存线程运行结束时刻所有的运行状态以便线程再次被操作系统调用可以在上一次被停止的时间点上无缝的继续运行、线程控制块用来记录线程自身的各种信息(如书中比喻的那样,线程控制块相当于线程的身份证),显然线程、线程栈以及线程控制块是需要通过一种方式联系起来使用,通过什么方式呢?是通过线程初始化函数【rt_thread_init】将这三者建立连接关系的,rt_thread_init通过传入的形参将线程控制块中该有的信息实际建档,这样之后操作系统就可以通过线程控制块来进行线程的各种控制了。              书中第六章通过线程初始化函数引出了线程链表节点的概念,但只是说往后要把线程插入到各种链表中就是通过这个节点来实现的,我想了想,如果我对操作系统的知识一无所知纯粹的从零开始学的话,这样的直接引入会让我感到困惑(当然这个困惑学习完了所有的知识之后是必然会消除的),那就是为什么要把线程插入到各种链表中?插入到链表中的是为了实现什么?所以我这里根据自己之前掌握的一点儿操作系统知识理解记录一下,既然我们知道了线程可能被系统调用运行也可能被操作系统轮休,也就是说线程其实是分成不同的工作状态的(好比我们是上班啊,还是休息啊,还是请假啊。。。)线程也一样,有就绪态、运行态、阻塞态三种状态(常规来说应该是分成这三种状态,可能还有的细分成死亡态,不过并不多见),OK,那既然线程是分成不同的工作状态的,这些个状态记录到哪呢?我们是不是可以在控制块中添加表示工作状态的变量来表示呢?NO,NO,NO,很明显不是一个好想法,操作系统会哭的。。。,这时候就该是线程链表节点现身来控制场面了,操作系统会维持几个链表,当线程处于非运行态时就乖乖的到某个链表中去,就好像我们工作在单位,休息了要回家(可能不是特别贴切。。)这样的话,操作系统通过各个链表就可以清晰明了的掌握了所有线程的工作状态。既然用到了链表,那就需要链表节点了,线程控制块中的线程链表节点刚好就是用来做这个工作的。关于链表的具体操作方法(插入、删除)就不做记录了。     今天就写这么多吧,水平有限,很多文字只是为了方便自己理解,写的并不一定准确。 此内容由EEWORLD论坛网友dong2213dong原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2019-04-23
  • 发表了主题帖: 【RT-Thread读书笔记】(0)一些基本概念及线程的理解

    本帖最后由 dong2213dong 于 2019-4-25 21:23 编辑     首先感谢论坛和RT-Thread组织的这次读书活动,收到《RT-Thread内核实现与应用开发实战指南》这本书已经有一个礼拜的时间了,虽然没有第一时间分享读书笔记,但这一个星期的时间仔细的阅读了书中前10章的内容,并按照书中建议“一边看书一边调试代码”,在keil5下把书中的代码跟着手动敲写了一番,下面就总结一下近期学习到的知识点。        书中1-4章节的内容,主要介绍了RT-Thread的简介和KEIL5环境的搭建,这些基础的知识就没什么总结的东西了。     一,裸机系统           裸机系统可分为轮询系统和前后台系统           (1)轮询系统:初始化好相关的硬件之后,主程序在一个死循环中不断循环,顺序的处理各种事物,适用于只需要顺序执行代码且不需要外部事件来驱动的就能完成的事情           (2)前后台系统:就是在轮询系统的基础上增加了中断机制,能够对外部事件进行响应,事件的处理回到轮询系统中完成(如果事 件处理的事情很简单,也可在中断服务程序里处理),其中中断被称为前台,主函数里面的无限循环称为后台           自己目前工作中用到的正是前后台系统的模式,没用到过纯粹的轮询系统     二,多线程系统            首先是线程的概念,线程是一段程序代码,虽然是代码,但是既然称为线程就必然具备一些特点:           (1)线程是独立的,不同的线程互不干扰             (2)线程一旦进入便无限循环并且不能返回           (3)线程具备自身的优先级           多线程系统,就是根据程序的功能,把程序主体分割成多个线程去处理,然后具体执行哪个线程,决定权交个操作系统,由操作系             统调度管理,这样相比于裸机系统,就不必自己设计程序的执行流程,但是会带来存储空间上的开销。           正如书中所言,无论是轮询系统、前后台系统还是多线程系统、各有各的应用领域优势,无好坏优劣之分,合适才是最好     三,线程栈            线程栈 — 单片机RAM里面一段连续的内存空间(通常是一个定义好的全局数组),那么线程栈是用来做什么的,为什么要用到线  程栈? 单片机有一组寄存器,这些寄存器中存储的值记录了程序运行的全部状态,因此在程序运行的不同时刻,里面的内容是会随时发生变的,既然用到了多线程系统,也就是说系统运行起来之后,各个线程随时会被系统调用或被系统轮休,并且线程被调用或轮休的时间点是随机的,那一个线程从被轮休到被调用要想无缝的从上次被轮休的时间点继续运行怎么才能做到,因为单片机的寄存器记录了程序运行的全部状态,也就是说一个线程从被轮休前运行的那一刻所有的执行状态都在单片机的寄存器中存储着了,但是单片机的寄存器只有一组,并且是时刻变化着的,因此,线程轮休前将寄存器的值保存起来,再次运行的时候,将保存的值恢复到单片机的寄存器中,就可以实现线程两次运行之间无缝连接了,因此就用到了线程栈,线程栈正是用来保存线程被轮休前的运行状态的。由此可见每一个线程都应该配备一个线程栈才行。     四,线程控制块         线程控制块是神马东西?又是做神马用的???         线程已经通过线程栈保存了轮休前运行状态信息,继续工作后知道自己应该从哪开始干活儿了,可以说线程自己的事儿解决了,但  是,线程啥时候开始干活儿,啥时候轮休要操作系统决定啊,那操作系统根据啥决定呢,到哪儿去找一个具体的线程来干活儿?那好吧,给线程建个账户,保存好线程的个人信息,这样操作系统要用到某个线程的时候,到账户下一查就明白了。既然是要保存线程的信息,毫无疑问,线程控制块就是存数据的了,其实,线程控制块一个数据结构,里面保存了线程的所有信息。        今天就先写这么多,洗洗睡了 此内容由EEWORLD论坛网友dong2213dong原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 回复了主题帖: 【读书月】聊聊好书有礼相送,说说你最喜欢哪本书吧

    买了本鸟哥的Linux私房菜,之前一直看电子版的,早就想买纸质的了,正好趁着读书日活动,果断下手!!!

  • 2019-04-09
  • 回复了主题帖: 【书籍已全部寄出】【读书月】读RT-THREAD技术好书活动入选名单公布

    信息正确,谢谢EE!!

  • 2019-04-08
  • 回复了主题帖: 不可一世的数学遇到高手之后也会放低她高傲的身段

    这个文章看过,写的确实好{:1_103:}{:1_103:}{:1_103:}

  • 2019-03-25
  • 回复了主题帖: 开关电源助理工程师面试题

    看看答案

  • 回复了主题帖: 出CC2650 launchpad和msp432 launchpad

    flashtt 发表于 2019-3-24 15:46 怎么又沉了,价格可以商量,主要毕业了把这些都给出了
    楼主,私信你了,可看到???

  • 2019-03-22
  • 加入了学习《DIY音乐盒》,观看 DIY音乐盒

  • 2019-03-21
  • 回复了主题帖: 【读书月】读一本RT-Thread技术好书,写下你的读书笔记

    okhxyyo 发表于 2019-3-21 15:13 稍等,我去测试一下,看看怎么回事。
    OK了,提交成功了:congratulate:

  • 回复了主题帖: 【读书月】读一本RT-Thread技术好书,写下你的读书笔记

    okhxyyo 发表于 2019-3-21 15:13 稍等,我去测试一下,看看怎么回事。
    谢谢管管:)

  • 回复了主题帖: 【读书月】读一本RT-Thread技术好书,写下你的读书笔记

    这个提示,是表示提交成功还是没成功啊?确定所有的信息都填写了

  • 2019-03-14
  • 回复了主题帖: PCB元件里有好几个封装的问题

    本帖最后由 dong2213dong 于 2019-3-14 08:37 编辑
    chenbingjy 发表于 2019-3-13 18:23 封装库中有0805封装。    就好比上面那个0805,我点击Remove,0805没了,可是还有一个0603,再删 ...
    你回复的这个问题跟你帖子中贴的报错图片不是一个问题,先说你帖子中贴出的报错图片,那个一定是没找到0805封装,即便像你在回复中贴出的图片一样name处有0805,但是你点击Edit看看,到底有没有对应的封装,一定是没有的;关于你回复中贴出的图片,这个根本没有必要去删除,你只要在Name选项中(像你说的展开可能有许多个)选择你需要的即可,当然这个封装必须在你指定的PCB封装库中存在,就不会有问题,至于展开后有多个封装是因为这个原件是经过多次拷贝并且曾指定过不同的封装(拿电阻来说可能用过0805、0603、0402等),但这多个选项不是同时生效的,也不会导致你第一幅图片中的错误,这些选项中你选择哪个就用哪个,不选的不生效,说的有点啰嗦,希望你能看明白

  • 2019-03-13
  • 回复了主题帖: PCB元件里有好几个封装的问题

    如果用的是同一个封装库的话,相同命名的封装是不能同时存在的吧,按你图中的报错提示,应该是报错对应你原理图中的原件指定的PCB封装库中根本就没有0805这个封装才对吧

  • 2019-03-12
  • 加入了学习《您所不知道的示波器使用技巧》,观看 ppt

最近访客

< 1/2 >

统计信息

已有43人来访过

  • 芯币:2180
  • 好友:3
  • 主题:27
  • 回复:327
  • 课时:1
  • 资源:5

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言