雷雨发庄稼吧 关注:4贴子:160

stm32cubemx+FreeRTOS学习(1):Tasks and Queues

取消只看楼主收藏回复

一、队列 Queues
1.队列的作用是用于任务(Task)之间传递消息的存储。发送消息的任务(生产者)将消息按1、2、3……的顺序存入,接收消息的任务(消费者)按顺序1、2、3……进行获取,即消息的存入读出顺序为先进先出。
2.使用stm32cubemx新建队列时可设置4个参数:
队列名称(Queues Name)
队列大小(Queues Size):队列内信息的个数
队列大小(Item Size):队列内信息的长度,默认值是uint16_t
队列大小(Queues Size):队列内信息的个数
内存分频(Allocation):给存储消息的内存的分配方式,动态(Dynamic)或静态(Static)
3.常用函数:
osMessagePut 向队列存入数据
osMessageGet 从队列顶获取数据


IP属地:浙江1楼2020-08-06 16:36回复
    IP属地:浙江2楼2020-08-06 16:38
    回复
      一、任务 Task
      1.任务是用来实际执行的操作。
      2.使用stm32cubemx新建队列时可设置6个参数:
      任务名称(Task Name)
      任务优先级(Priority):共有7个优先级,realtime优先级最高
      任务堆栈大小(Stack Size):用于存放任务内的变量


      IP属地:浙江3楼2020-08-06 16:59
      回复
        转自:https://www.cnblogs.com/daidong805/p/7199387.html


        IP属地:浙江4楼2020-10-30 13:27
        回复
          如果将所有任务都设置在相同的优先级,那么在系统跑起来之后,所有任务将进行轮盘式的调度。如果任务仅仅具有不同的优先级而没有经过其他处理时。高优先级的任务将一直重复运行,将低优先级的任务“饿死(starved))”。


          IP属地:浙江5楼2020-10-30 13:28
          回复
            事件驱动:
            为了使我们的任务切实有用,我们需要通过某种方式来进行事件驱动。一个事件驱动任务只会在事件发生后触发工作(处理),而在事件没有发生时是不能进入运行态的。调度器总是选择所有能够进入运行态的任务中具有最高优先级的任务。一个高优先级但不能够运行的任务意味着不会被调度器选中,而代之以另一个优先级虽然更低但能够运行的任务。因此,采用事件驱动任务的意义就在于任务可以被创建在许多不同的优先级上,并且最高优先级任务不会把所有的低优先级任务饿死。


            IP属地:浙江6楼2020-10-30 13:29
            回复
              任务有两种大的运行状态:运行态和非运行态。非运行态有较多类型,以下一一解释:
              1 阻塞态 blocked:
              任务可以进入阻塞态以等待以下两种不同类型的事件:
              1. 定时(时间相关)事件——这类事件可以是延迟到期或是绝对时间到点。比如说某个任务可以进入阻塞态以延迟10ms。
              2. 同步事件——源于其它任务或中断的事件。比如说,某个任务可以进入阻塞态以等待队列中有数据到来。同步事件囊括了所有板级范围内的事件类型。
              任务可以在进入阻塞态以等待同步事件时指定一个等待超时时间,这样可以有效地实现阻塞状态下同时等待两种类型的事件。
              我们可以利用阻塞态进行相应的延时操作提高系统的效率,原来使用for循环或者while循环进行延时,处理器进行的都是很多无用的操作。使用阻塞态进行延时时,处理器可以处理其他任务。从而提高了系统的效率。调用vTaskDelay() API 函数来代替空循环即可。
              void vTaskDelay( portTickType xTicksToDelay );
              xTicksToDelay 延迟多少个心跳周期。调用该延迟函数的任务将进入阻塞态,经延迟指定的心跳周期数后,再转移到就绪态。
              举个例子,当某个任务调用vTaskDelay( 100 )时,心跳计数值为10,000,则该任务将保持在阻塞态,直到心跳计数计到10,100。
              常数 portTICK_RATE_MS 可以用来将以毫秒为单位的时间值转换为以心跳周期为单位的时间值。


              IP属地:浙江7楼2020-10-30 13:32
              回复
                2 挂起状态 (suspended))
                。让一个任务进入挂起状态的唯一办法就是调用vTaskSuspend() API 函数;而把一个挂起状态的任务唤醒的唯一途径就是调用vTaskResume() 或vTaskResumeFromISR() API 函数。大部分应用程序都不需要进入挂起状态。不在详细赘述。
                3 就绪状态 (ready)
                任务处于非运行状态,但既没有阻塞也没有挂起,则这个任务处于就绪(ready,准备或就绪)状态。处于就绪态的任务能够被运行,但是没有运行。当前状态的任务已经具有了所有可执行的条件,只等待处理器将他进行调度。


                IP属地:浙江8楼2020-10-30 13:34
                回复
                  操作系统中睡眠、阻塞、挂起的区别形象解释:
                  首先这些术语都是对于线程来说的。对线程的控制就好比你控制了一个雇工为你干活。你对雇工的控制是通过编程来实现的。
                  挂起线程的意思就是你对主动对雇工说:“你睡觉去吧,用着你的时候我主动去叫你,然后接着干活”。
                  使线程睡眠的意思就是你主动对雇工说:“你睡觉去吧,某时某刻过来报到,然后接着干活”。
                  线程阻塞的意思就是,你突然发现,你的雇工不知道在什么时候没经过你允许,自己睡觉了,但是你不能怪雇工,因为本来你让雇工扫地,结果扫帚被偷了或被邻居家借去了,你又没让雇工继续干别的活,他就只好睡觉了。至于扫帚回来后,雇工会不会知道,会不会继续干活,你不用担心,雇工一旦发现扫帚回来了,他就会自己去干活的。因为雇工受过良好的培训。这个培训机构就是操作系统。


                  IP属地:浙江9楼2020-10-30 13:44
                  回复
                    临界段代码
                    临界段代码也叫做临界区,是指那些必须 完整运行,不能被打断的代码段,比如有的外设的初始化需要严格的时序,初始化过程中不能被打断。
                    FreeRTOS与临界段代码保护有关的函数有 4个: taskENTER_CRITICAL()、taskEXIT_CRITICAL()、taskENTER_CRITICAL_FROM_ISR()和taskEXIT_CRITICAL_FROM_ISR()。这四个函数其实是宏定义,在 task.h文件中有定义。 这四个函数的区别是前两个是任务级的临界段代码保护,后两个是中断级的临界段代码保护。


                    IP属地:浙江10楼2020-10-30 15:15
                    回复
                      FreeRTOS是一个抢占式的实时多任务系统 那么其任务调度器也是抢占式的


                      IP属地:浙江11楼2020-10-30 15:29
                      回复
                        完成当前任务需要任务切换时,不一定要用延时函数,其他只要能让 FreeRTOS发生任务切换的 API函数都可以,比如请求信号量、队列等,甚至直接调用任务调度器。 只不过最常用的就是 FreeRTOS的延时函数。


                        IP属地:浙江12楼2020-10-30 15:53
                        回复
                          创建任务的时候需要给任务指定堆栈,如果使用的函数 xTaskCreate()创建任务 (动态方法 )的话那么任务堆栈就会由 函数 xTaskCreate()自动创建,后面分析 xTaskCreate()的时候会讲解。
                          如果使用函数 xTaskCreateStatic()创建任务 (静态方法 )的话就需要程序员自行定义任务堆栈


                          IP属地:浙江13楼2020-10-30 15:55
                          回复
                            列表被FreeRTOS调度器使用,用于跟踪任务,处于就绪、挂起、延时的任务,都会被挂接到各自的列表中。用户程序如果有需要,也可以使用列表。
                            FreeRTOS列表使用指针指向列表项。一个列表(list)下面可能有很多个列表项(list item),每个列表项都有一个指针指向列表。


                            IP属地:浙江14楼2020-10-30 16:36
                            回复
                              xTaskGetTickCount() 获取系统时间计数器值。
                              xTaskGetTickCountFromISR() 在中断服务函数中获取时间计数器值


                              IP属地:浙江15楼2020-10-30 16:42
                              回复