Atmel SAM4S RTOS演示
使用免费的Atmel Studio 6 IDE、GCC和Atmel软件框架
[ RTOS端口]
简介
此页面记录FreeRTOS演示应用程序
SAM4S ARM CORTEX-M4微控制器
来自Atmel。 演示
使用FreeRTOS GCC ARM Cortex-M3/4端口,
Atmel Studio 6 IDE 和组件
综合 Atmel Sofeware Framework 的组件
( ASF )。 该项目被预先配置为在 SAM4S-EK 评估套件上运行。
重要! 关于使用FreeRTOS SAM4S 演示项目的说明
在使用此RTOS端口之前,请阅读以下所有要点。
- 源代码组织
- 演示应用程序
- RTOS 配置和使用详情
另请参阅常见问题:我的应用程序未运行,问题可能出在哪里?
源代码组织
FreeRTOS zip 文件包含所有 FreeRTOS 的源文件
移植和所有演示应用程序,其中只有少数需要使用在该
是本项目需要的。
请参阅源代码组织
了解关于已下载文件的说明
新项目。
ATSAM4S 演示应用程序的Atmel Studio 6 解决方案文件
RTOS Demo.atsln ,位于 FreeRTOS/Demo/cortex_M4_ATSAM4S_Atmel_Studio
目录中。
此页中的项目目录结构准备章节
此页的包含有关准备此目录的重要信息。
Atmel ARM Cortex-M4演示应用程序
硬件设置
如果 mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 0(请参阅下文功能
章节),则演示中将包括标准的 com 测试任务。 标准
演示 com 测试会创建两个任务:将字符发送到 USART 的 Tx 任务
和预期接收 Tx 任务发送的每个字符的 Rx 任务。 USART 端口
需要一个环回连接器才能让此机制正常运行:只需
连接引脚2到9路连接器上的引脚3 ,其标记为“USART”
SAM4S-EK.
应注意的是, COM测试任务包括用于演示队列
任务和中断之间通讯使用的队列,以及
从内部中断服务例程执行上下文切换。 使用的
串行驱动程序不是为了展示高效的实现过程。
实际应用程序应使用 USART 的外围 DMA 通道 (PDC)。
功能性
mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 在 main.c 中定义。 演示的行为
取决于其设置。
mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 1 时的功能
如果 mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 1,则 main() 将
调用 main_blinky()。 main_blinky() 创建一个非常简单的演示如下:
-
main_blinky() 函数:
main_blinky() 会创建一个队列和两个任务。 然后它会启动
RTOS 调度器。
-
队列发送任务:
队列发送任务由 main_blinky.c 中的 prvQueueSendTask() 函数实现。
它每隔 200 毫秒向队列发送数值 100。
-
队列接收任务:
队列接收任务由 main_blinky.c 中的 prvQueueReceiveTask() 函数实现
在main_blinky.c中。 它以块时间从队列中反复读取
如果队列为空,则此任务会进入已阻塞状态
如果队列为空。 每次从队列接收的值为 100 时,任务都切换红色 LED。
因此,从队列接收,因为队列每200毫秒发送任务到
队列,队列接收任务应退出
阻塞状态,每 200 毫秒切换红色 LED。
mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 0 时的功能
如果 mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 0 ,则 main() 将
调用 main_full()。 main_full() 会创建一个全面测试和演示应用程序
这表明:
创建的任务来自标准演示
集。 所有 FreeRTOS 移植演示应用程序都使用标准演示任务。
这些任务没有特定的功能,创建它们仅为演示如何使用 FreeRTOS API
如何测试 RTOS 移植。
main() 创建 34 个任务和 3 个软件定时器后会
启动 RTOS 调度器。 然后,演示在运行期间动态地连续创建
创建并删除另外两个任务。
创建“检查”软件定时器,定期检查标准
演示任务,以确保所有任务都能
正常运行。 检查软件定时器
回调函数切换 SAM4S-EK 硬件上的绿色 LED。
这给出了
可视化反馈。 如果绿色 LED 每 3 秒切换一次,则
说明 'check' 软件定时器未发现任何问题。 如果 LED
每 200 毫秒切换一次,则表明检查软件定时器
在一个或多个任务中发现了问题。 如需测试这个机制,可以
移除环回连接器。这么做会导致
com 测试任务失败。
项目目录结构准备
Atmel Studio要求项目构建的所有源文件所在的目录,或所
包含 Atmel Studio 项目本身的目录或其子目录下。
因此,有必要将演示应用程序使用的 FreeRTOS
和演示应用程序使用的标准演示源文件
它们在标准 FreeRTOS 目录结构中的位置复制到
目录中复制。 提供一个名为CreateProjectDirectoryStructure.bat的批处理文件
完成此功能。
CreateProjectDirectoryStructure.bat位于 FreeRTOS/Demo/cortex_M4_ATSAM4S_Atmel_Studio 目录中,
并且必须在演示应用程序
演示应用程序。
构建并执行演示应用程序
-
确保已执行CreateProjectDirectoryStructure.bat批处理文件。
-
打开 FreeRTOS/演示/cortex_M4_ATSAM4S_Atmel_Studio/RTOS Demo.atsln
从Atmel Studio IDE中打开。
-
打开 main.c ,并设置 mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 以生成
简单的 blinky 演示,或完整的测试和演示应用程序
。
-
确保目标硬件连接使用
合适的J-Link或SAM-ICE接口连接到计算机。 此项目使用
J -Link 创建。
-
从 IDE 的 ‘构建 (Build)’菜单中选择 '构建解决方案 (Build Solution)',
RTOS 演示项目的构建应该不会报错或出现警告。
-
构建完成后,从IDE的调试中选择“开始调试并中断”
菜单,对SAM4S微控制器闪存进行编程,启动调试
并使调试器在输入main()函数时中断。
ARM Cortex-M4 FreeRTOS端口特定配置
此演示的特定配置项目包含在 FreeRTOS/Demo/cortex_M4_ATSAM4S_Atmel_Studio/src/FreeRTOSConfig.h 中。
可以编辑此文件中定义的常量,以适合您的应用程序。 特别是:
-
configTICK_RATE_HZ
此常量设置了 RTOS tick 中断的频率。 提供的数值 1000 Hz 可用于
测试 RTOS 内核功能,但此频率比大多数应用程序所需的频率都要高。
降低频率会提高效率。
-
configKERNEL_INTERRUPT_PRIORITY and configMAX_SYSCALL_INTERRUPT_PRIORITY
请 参阅 RTOS 内核配置文档,获取这些配置常量的完整信息。
-
configLIBRARY_LOWEST_INTERRUPT_PRIORITY 和 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
尽管 configKERNEL_INTERRUPT_PRIORITY 和 configMAX_SYSCALL_INTERRUPT_PRIORITY
是完整的 8 位偏移值,定义为原始值,直接用于
ARM Cortex-M4 NVIC 寄存器;configLIBRARY_LOWEST_INTERRUPT_PRIORITY
和 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
与其等效,但定义为仅使用 4 个优先级位,用于 SAM4
NVIC。
提供这些值是因为 CMSIS 库函数 NVIC_SetPriority()
需要未偏移的 4 位格式。
请注意!: 请参阅说明如何在 ARM Cortex-M 设备上设置中断优先级的页面。 请记住,ARM Cortex-M 核心中,
数字越小表示中断优先级越高。 这一点
可能有悖直觉,容易混淆! 如果要将
中断设置为低优先级,请不要将其优先级指定为 0(或其他低数值),
因为这会导致该中断在系统中具有
最高优先级,并且如果这个优先级
高于 configMAX_SYSCALL_INTERRUPT_PRIORITY,可能会导致系统崩溃。 另外,请勿忘记
分配中断优先级,因为默认情况下,中断优先级为 0,
这可能导致其处于最高优先级。
ARM Cortex-M 核心上的最低优先级实际上是 255,但不同
ARM Cortex-M 微控制器制造商会实现不同数量的优先级位,
并提供优先级指定方式不同的库函数。 例如,
在Atmel SAM4 ARM CORTEX-M4微控制器上,您可以指定的最低优先级实际上为15 -这是由
FreeRTOSConfig.hCONFIGLIBRARY_LOWEST_INTRUPT_PROJECT中常数定义的。 可指定的最高优先级
始终为零。
我们还建议确保将所有优先级位分配为
抢占式优先级位,并且不设置子优先级位,就和演示
中的一样。
每个移植 #defines 'BaseType_t' 为对该处理器而言最有效的
数据类型。 此移植将 BaseType_t 定义为长类型。
中断服务例程
与许多 FreeRTOS 移植不同的是,引发上下文切换的中断服务例程
无特殊要求,可根据编译器文档进行编写。
宏 portEND_SWITCHING_ISR() 可用于在
中断服务程序内请求上下文切换。
请注意,portEND_SWITCHING_ISR() 将启用中断。
下列源代码片段仅作为示例提供。 中断
使用信号量与任务(未显示)同步,并调用 portEND_SWITCHING_ISR
以确保中断直接返回任务。 参见函数
此示例中 serial.c 文件中的 USART1_Handler() 函数
。
void Dummy_IRQHandler(void)
{
long lHigherPriorityTaskWoken = pdFALSE;
/* Clear the interrupt if necessary. */
Dummy_ClearITPendingBit();
/* This interrupt does nothing more than demonstrate how to synchronise a
task with an interrupt. A semaphore is used for this purpose. Note
lHigherPriorityTaskWoken is initialised to zero. */
xSemaphoreGiveFromISR( xTestSemaphore, &lHigherPriorityTaskWoken );
/* If there was a task that was blocked on the semaphore, and giving the
semaphore caused the task to unblock, and the unblocked task has a priority
higher than the current Running state task (the task that this interrupt
interrupted), then lHigherPriorityTaskWoken will have been set to pdTRUE
internally within xSemaphoreGiveFromISR(). Passing pdTRUE into the
portEND_SWITCHING_ISR() macro will result in a context switch being pended to
ensure this interrupt returns directly to the unblocked, higher priority,
task. Passing pdFALSE into portEND_SWITCHING_ISR() has no effect. */
portEND_SWITCHING_ISR( lHigherPriorityTaskWoken );
}
只有以 “FromISR” 结尾的 FreeRTOS API 函数可以从
中断服务例程中调用 - 而且中断的优先级须
小于或等于 configMAX_SYSCALL_interrupt_PRIORITY
配置常量(或 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY)设置的优先级。
FreeRTOS 使用的资源
FreeRTOS 需要独占 SysTick 和 PendSV 中断。 其也使用 SVC 编号 #0。
抢占式内核和协作式 RTOS 内核之间的切换
将 FreeRTOSConfig.h 中的定义 configUSE_PREEMPTION 设置为 1 即可使用抢占式内核,
可使用协作式内核。 选择协作式 RTOS 调度器时,完整的演示应用程序可能
无法正确执行。
编译器选项
与所有的端口一样,使用正确的编译器选项至关重要。 若要确保这一点,
最佳方法是基于提供的演示应用程序文件构建您的应用程序。
内存分配
Source/Portable/MemMang/heap_4.c包含在ARM Cortex-M4演示应用项目中,以提供
RTOS 内核所需的内存分配。
请参阅 API 文档的内存管理部分,
以获取完整信息。
其他事项
请注意,vPortEndScheduler() 尚未实现。
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.