﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Thinking in C++-文章分类-FreeRTOS</title><link>http://www.cppblog.com/yishanhante/category/13839.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 18 May 2010 15:36:26 GMT</lastBuildDate><pubDate>Tue, 18 May 2010 15:36:26 GMT</pubDate><ttl>60</ttl><item><title>配置参量</title><link>http://www.cppblog.com/yishanhante/articles/115721.html</link><dc:creator>jay</dc:creator><author>jay</author><pubDate>Tue, 18 May 2010 13:10:00 GMT</pubDate><guid>http://www.cppblog.com/yishanhante/articles/115721.html</guid><wfw:comment>http://www.cppblog.com/yishanhante/comments/115721.html</wfw:comment><comments>http://www.cppblog.com/yishanhante/articles/115721.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yishanhante/comments/commentRss/115721.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yishanhante/services/trackbacks/115721.html</trackback:ping><description><![CDATA[<p>配置参量(位于FreeRTOSConfig.h)<br>configUSE_PREEMPTION<br>设置为1，使用抢先式内核；设置为0，为合作轮转内核。 </p>
<p>configUSE_IDLE_HOOK<br>设置为1， 使用空闲钩子；设置为0，不使用空闲钩子,。 </p>
<p>configUSE_TICK_HOOK<br>如果希望使用时间片钩子, 就设置为1，设置为0，不使用 </p>
<p>configCPU_CLOCK_HZ<br>内部处理器执行的频率。这个值需要正确配置外围定时器。 </p>
<p>configTICK_RATE_HZ<br>The frequency of the RTOS tick interrupt. </p>
<p>RTOS时间片中断的频率。 </p>
<p>时间片中断用来测量时间。因此更高时间片频率意味着时间测量可以有更高分辨率，同时意味着内核占用更多的CPU（效率很低）。演示程序都使用了1000Hz的时间片频率。这是为了测试内核，通常需要更高的频率。 </p>
<p>多个任务共有同一优先级。通过切换任务，在每一个RTOS时间片内，内核将在同一优先级的任务间分配处理器时间。高时间片频率意味着将减少给予每个任务的时间份额。 </p>
<p>configMAX_PRIORITIES<br>应用程序任务中可用优先级 的数目.&nbsp; </p>
<p>任何数量的任务，都可以分配同一优先级。 任务单独分配优先级。参考configMAX_CO_ROUTINE_PRIORITIES。 内核分配的每个可用的优先级都消耗RAM，因此这个值不应该设置为高于实际应用程序中需要的。 </p>
<p>configMINIMAL_STACK_SIZE<br>空闲任务使用的堆栈大小。通常这个值不用少于 FreeRTOSConfig.h file中演示程序提供的。 </p>
<p>configTOTAL_HEAP_SIZE<br>内核总共可用的RAM数量。如果程序中利用例子中内存分配方案（FreeRTOS 源代码提供的），这个值仅仅适用这些。参考内存管理 部分获得更过细节. </p>
<p>configMAX_TASK_NAME_LEN<br>当创建一个任务，能够给予描述任务名称的最大容许长度。这个长度指定符号数目，包括NULL终止字节。 </p>
<p>configUSE_TRACE_FACILITY<br>设置为1，使用可视化追踪功能。设置为0，就不使用。如果使用可视化追踪，必须提供追踪缓冲区。 </p>
<p>configUSE_16_BIT_TICKS<br>时间片（内核开始执行后，时间片中断的次数）来测量时间。时间片计数器定义为可用的portTickType.类型。</p>
<p>定义configUSE_16_BIT_TICKS为1，将使portTickType定义为16位无符号类型。定义为0，将是32位无符号类型。 使用16位类型，将使在16位或8位单片机大幅度提高性能。但是，这样限制了最大指定可用时间周期（65535时间片）。然而，假定时间片频率为250Hz，一个任务在16位上，最大延时或中断时间位262秒，而32位为17179869秒。</p>
<p>configIDLE_SHOULD_YIELD<br>这个参数控制任务与空闲任务优先级相同时的行为。仅仅有以下影响：</p>
<p>1.使用优先级调度 <br>2.用户程序创建的任务，运行在空闲任务一样的优先级 <br>任务在时间片轮转中，使用同一优先级。假定没有更高优先级的任务，这样每一个任务，在空闲优先级下，将被分配相同数量的处理时间。如果，他们的优先级高于空闲任务的优先级，那么这种情况更是如此。 当任务处于空闲优先级下的行为，会有稍许不同。当configIDLE_SHOULD_YIELD设置为1时，当其他在空闲优先级的任务准备运行时，空闲任务将立刻让出CPU。当程序的任务调度可用时，要确保空闲任务能够执行的最少时间以上。这个行为，产生了不好的影响（根据应用程序的需要），如下描述： </p>
<p><br>上述图表表明，四个在空闲优先级的任务执行模型。任务A, B,和C，是应用程序任务。任务 I是空闲任务。上下文切换在T0, T1....T6规律的周期间发生。当空闲任务执行时，任务A准备执行，但是空闲任务已经占去了当前时间片的部分时间。结果是，任务I 和任务A共同分享一个时间片。任务B 和任务C比任务A获得更多的执行时间。 </p>
<p>这些可以通过如下避免： </p>
<p>1.如果合适，可以使用空闲钩子代替在空闲优先级的分开任务。创建程序任务的优先级高于空闲优先级。 <br>2.设置configIDLE_SHOULD_YIELD为1 <br>设置configIDLE_SHOULD_YIELD为1，将阻止空闲任务让出执行时间直到它的时间片用完。这就确保了所有在空闲优先级的任务分配了相同数量的执行时间。这是以分配给空闲任务更高比例的执行时间为代价。</p>
<p>configUSE_MUTEXES<br>设置为1，将使用互斥功能；设置为0，将不使用。读者应该明白FreeRTOS.org 功能中互斥型和二进制型信号量之间的不同。 </p>
<p>configUSE_RECURSIVE_MUTEXES<br>设置为1，将使用递归互斥功能；设置为0，将不使用。 </p>
<p>configUSE_COUNTING_SEMAPHORES<br>设置为1，将使用计数器型信号量功能；设置为0，将不使用。 </p>
<p>configUSE_ALTERNATIVE_API<br>设置为1，将包含替代队列函数；设置为0，将不包含。替代API在queue.h头文件中有详细的描述。 </p>
<p>configCHECK_FOR_STACK_OVERFLOW<br>The 堆栈溢出检测 这页中有详细的细节描述。 </p>
<p>configQUEUE_REGISTRY_SIZE<br>队列记录有两个功能，都这涉及到内核相关的调试：</p>
<p>1.允许一个队列相关的名称，可以在GUI调试中容易定义。 <br>2.包含了调试器所需的信息，来定位每个记录的队列和信号量。 <br>队列记录除了进行内核相关的调试外，没有什么目的。 configQUEUE_REGISTRY_SIZE定义了可以记录的队列和信号量的最大数目。这些仅能够在使用内核相关调试时需要记录的。查看API中vQueueAddToRegistry() 和 vQueueUnregisterQueue()参考文档，获得更多信息。</p>
<p>configUSE_CO_ROUTINES<br>设置为1，将使用（协同例程）合作轮转式程序；设置为0，将不使用。当使用时，必须把Croutine.c包含进去项目中。 </p>
<p>configMAX_CO_ROUTINE_PRIORITIES<br>合作式应用程序中可用的优先级数目。 任何合作式程序可使用同一优先级。任务分别设置优先级——参考configMAX_CO_ROUTINE_PRIORITIES. </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Cortex M3 使用着请注意部分结尾特别说明的地方。 </p>
<p><br>configKERNEL_INTERRUPT_PRIORITY应该设置为最低优先级。 </p>
<p>注意如下讨论中，以"FromISR" 结尾的API函数仅能够在中断服务函数中调用。 </p>
<p>那些仅仅设置configKERNEL_INTERRUPT_PRIORITY的接口 </p>
<p>内核本身为 configKERNEL_INTERRUPT_PRIORITY设置优先级。调用API函数的中断，也必须以这个优先级执行。没有调用API函数的中断，可以有更高的优先级，因此内核调动，他们执行从不延时（在他们硬件限制的范围内）。 那些在这两种情况下： </p>
<p>configKERNEL_INTERRUPT_PRIORITY and configMAX_SYSCALL_INTERRUPT_PRIORITY执行的接口。 </p>
<p>内核本身为configKERNEL_INTERRUPT_PRIORITY设置优先级。可以设置configMAX_SYSCALL_INTERRUPT_PRIORITY为从调用FreeRTOS.org API 函数的中断设置更高的优先级。 </p>
<p>可以设置configMAX_SYSCALL_INTERRUPT_PRIORITY高于 （一个很高优先级的水平）configKERNEL_INTERRUPT_PRIORITY来获得 中断全嵌套模式。没有调用API函数的中断可以在高于configMAX_SYSCALL_INTERRUPT_PRIORITY 优先级下执行，因此是不会被内核执行延时。例如，假定一个微控制器，为8级中断优先级水平——0是最低优先级，7为最高（参考Cortex M3用户在这部分的结尾特别注意的地方）。如下图片，描述了在每一个优先级下什么可以和什么不可以，两个常量被设置为4和0。 </p>
<p><br>中断优先级配置例子 <br>这些参数配置允许很灵活的中断处理： </p>
<p>&#8226;中断处理的任务，像系统里其他任务一样，书写和分配优先级。这些任务都是被一个中断激活。ISR本身编写的应该尽可能的短小——仅仅为了唤醒更高优先级的任务而占用RAM。ISR返回，直接进入要唤醒的任务——因此中断处理是及时的好像所有是中断本身做的一样。这样的好处是：执行处理的任务时，所有的中断都允许。 <br>执行 configMAX_SYSCALL_INTERRUPT_PRIORITY的接口提供更多——在内核中断和configMAX_SYSCALL_INTERRUPT_PRIORITY 之间允许全嵌套模式嵌套和程序调用API函数。中断优先级在configMAX_SYSCALL_INTERRUPT_PRIORITY执行从不延时。 </p>
<p>&#8226;运行在高于系统调用最大优先级的ISR，从不会被内核本身屏蔽，所以他们的响应性不被内核功能所影响。对于那些需要瞬间高精度的中断来说是个好方法——例如：执行发动机换向的中断。然而，这样的ISR不能够使用FreeRTOS.org API函数 <br>为了利用这个方案，应用程序必须遵守如下原则：任何使用FreeRTOS.org API的中断必须设置为同一优先级，像内核（configKERNEL_INTERRUPT_PRIORITY配置的一样），或者处于或低于configMAX_SYSCALL_INTERRUPT_PRIORITY（为了接口包含了这个功能）。 </p>
<p>Cortex M3 用和特别要注意的地方： 记住,Cortex M3 核心数值上使用低优先级来代替高优先级的中断（这样看起来反常规和容易忘记）。如果希望分配够中断一个低优先级，不要分配为0优先级（或其他低数值），因为这样实际上在系统中这个中断为最高优先级——如果设置优先级在configMAX_SYSCALL_INTERRUPT_PRIORITY可能使系统崩溃。 在Cortex M3核心 最低优先级实际上是255——然而不同于 Cortex M3 卖主说明的不同数目的优先级位和支持库函数（期待优先级使用不同方法指定）。例如在STM32 ，在ST驱动库中能够指定的最低优先级是15——最高优先级可以指定为0。configKERNEL_INTERRUPT_PRIORITY and configMAX_SYSCALL_INTERRUPT_PRIORITY</p>
<p>configKERNEL_INTERRUPT_PRIORITY一般适用于Cortex-M3, PIC24, dsPIC and PIC32 接口。 configMAX_SYSCALL_INTERRUPT_PRIORITY一般PIC32和Cortex M3 接口中可用。其他接口将很快更新。 </p>
<img src ="http://www.cppblog.com/yishanhante/aggbug/115721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yishanhante/" target="_blank">jay</a> 2010-05-18 21:10 <a href="http://www.cppblog.com/yishanhante/articles/115721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>