CPK-RA6M4评估板入门指南
要点
CPK-RA6M4是用于RA6M4单片机的评估板套件。该套件可通过灵活配置软件包(FSP)和e2 studio IDE,对RA6M4 MCU群组的特性进行无缝评估,并对嵌入系统应用程序进行开发。本文档是《瑞萨RA MCU基础知识》的配套文档,旨在将该指南中有关硬件操作的部分在CPK-RA6M4评估板上进行实现。
在使用本文档之前,推荐您先学习《瑞萨RA MCU基础知识》,以了解更多关于RA MCU的基础知识以及其他相关知识,这样有助于您在本文所述的硬件实操中更快上手。
开发环境
e2 studio:2021-04版
FSP:v3.1.0
目录
首次使用瑞萨CPK-RA6M4评估板
下载并测试示例
Hello World! – Hi Blinky!
使用实时操作系统
4. 使用实时操作系统
本章内容基于《瑞萨RA MCU基础知识》中的章节9使用实时操作系统所作。
您将在本章中学到以下内容:
什么是线程、信号量和队列,以及如何使用它们。
如何在e2 studio中向程序添加线程和信号量。
上一章中的练习已经利用了瑞萨RA系列单片机(MCU)灵活配置软件包(FSP)的很大一部分。在本章中,您将使用FreeRTOS实时操作系统创建一个小型应用程序,利用线程控制LED并利用信号量实现与按钮的同步。您将亲身体验到这实际上仅需要几个步骤。
我们将从头开始创建完整的项目,因此如果您没有进行过之前的实验,请不必担心。
4.1 线程、信号量和队列
在我们实际深入进行此练习之前,需要定义将在本章和下一章中使用的一些术语,以确保我们能够达成共识。
首先,需要定义术语“线程”。如果您更习惯于“任务”这个表达方式,只需把线程看作是一种任务。有些人甚至互换使用这两个短语。当使用实时操作系统(RTOS)时,单片机上运行的应用程序将拆分为几个较小的半独立代码块,每个代码块通常控制程序的一个方面。这些小片段称为线程。一个应用程序中可以存在多个线程,但是在任何给定时间都只能有一个线程处于活动状态,因为RA系列单片机是单核器件。每个线程都有自己的堆栈空间,如果需要安全的上下文,则可以将其置于MCU的安全侧。每个线程还分配有优先级(相对于应用程序中的其他线程),并且可以处于不同的状态,例如运行、就绪、阻塞或暂停。在FreeRTOS中,可以通过调用eTaskGetState()API函数来查询线程的状态。线程间信号传输、同步或通信是通过信号量、队列、互斥、通知、直接任务通知或者流和消息缓冲区来实现的。
信号量是RTOS的资源,可用于传输事件和线程同步(以产生者-使用者方式)。使用信号量允许应用程序暂停线程,直到事件发生并发布信号量。如果没有RTOS,就需要不断地轮询标志变量或创建代码来执行中断服务程序(ISR)中的某个操作,这会在相当长的一段时间内阻塞其他中断。使用信号量可快速退出ISR并将操作推迟到相关线程。
FreeRTOS提供计数信号量和二进制信号量。尽管二进制信号量由于只能采用两个值(0和1)而非常适合实现任务之间或中断与任务之间的同步,但是计数信号量的计数范围可涵盖0到用户在FSP配置器中创建信号量期间指定的最大计数。默认值为256,可支持设计人员执行更复杂的同步操作。
每个信号量都有两个相关的基本操作:xSemaphoreTake()(将使信号量递减1)和xSemaphoreGive()(将使信号量递增1)。这两个函数有两种形式:一种是可以从中断服务程序内部调用(xSemaphoreTakeFromISR()和SemaphoreGiveFromThread())的形式,另一种则是上述可以在线程的正常上下文中调用的形式。
我们需要讨论的最后一个术语是队列,即使在本练习中不使用队列,下一章的练习中也会使用。报文队列是线程间通信的主要方法,它允许在任务之间或中断与任务之间发送消息。消息队列中可以有一条或多条消息。数据(也可以是指向更大缓冲区的指针)会复制到队列中,即,它不存储引用而是消息本身。新消息通常置于队列的末尾,但也可以直接发送到开头。接收到的消息将从前面开始删除。
允许的消息大小可在设计时通过FSP配置器指定。默认项大小为4个字节,默认队列长度(表示队列中可存储的项数)为20。所有项的大小必须相同。FreeRTOS中的队列数没有限制;惟一的限制是系统中可用的存储空间。使用xQueueSend()函数将消息放入队列中,并通过xQueueReceive()从队列中读取消息。与信号量一样,函数有两种版本:一种可以从线程的上下文调用,另一种可以从ISR内部调用。
4.2 使用e2 studio将线程添加到FreeRTOS中
接下来的练习也是基于CPK-RA6M4评估板。这次,我们将使用电路板下方的用户按钮S1向应用程序传输事件,应用程序将切换红色LED的状态进行响应。为实现目标,我们将使用FreeRTOS,事件的处理将在线程内进行,并通过信号量进行通知。
第一步是使用项目配置器创建一个新项目。首先,转到“File → New →“RenesasRAC/C++ Project””(文件→新建→Renesas C/C++ 项目)。单击“Next”(下一步)并在出现的屏幕上输入项目名称,例如CPK_RA6M4_RtosProject。再次单击“Next”(下一步)。此操作将转到“Device and Tools Selection”(器件和工具选择)窗口。首先,选择一个电路板。选择CPK-RA6M4并将相应的器件设置为R7FA6M4AF3CFB(如果尚未列出)。查看工具链:它应显示为GCC Arm Embedded。单击“Next”(下一步)继续操作。
在当前出现的屏幕中,可以在非TrustZone与安全和非安全TrustZone项目之间进行选择。保持“Flat(Non-TrustZone)Project”(扁平化(非TrustZone)项目)处于选中状态,然后单击“Next”(下一步)。随即出现“Build Artifact andRTOSSelection”(构建工件和RTOS选择)窗口。保持设置不变,即在“Build Artifact Selection”(构建工件选择)下选择“Executable”(可执行文件),在“RTOS Selection”(RTOS 选择)下选择FreeRTOS。单击“Next”(下一步),转到下一个名为“Project Template Selection”(项目模板选择)的屏幕。在此,选择“FreeRTOS – Minimal – Static Allocation”(FreeRTOS–最小化–静态分配)。
最后,单击“Finish”(完成),在配置器生成项目后,e2 studio将询问您是否切换到“FSP Configuration”(FSP配置)透视图。透视图出现后,直接转到“Stacks”(堆)选项卡。该选项卡将在“Threads”(线程)窗格中显示“HAL/Common”(HAL/通用)线程的单个条目,其中包含I/O端口的驱动程序。单击窗格顶部的“New Thread”(新线程)图标(请参见图4-1添加新线程)。
图4-1:在FSP配置器出现之后,将仅显示一个线程。选择“New Thread”(新线程)按钮,添加另一个线程
现在,在“Properties”(属性)视图中更改新线程的属性:将“Symbol”(符号)重命名为led_thread,将“Name”(名称)重命名为LED Thread。其他属性保持默认值。在“LED Thread Stack”(LED线程堆)窗格中,单击“New Stack”(新线程)按钮图标,选择“Driver → Input → External IRQ Driver on r_icu”(驱动程序→输入→r_icu上的外部IRQ驱动程序)(请参见图4-2)。
图4-2:添加新驱动程序只需单击几下鼠标
此操作将为外部中断添加驱动程序。查看新驱动程序的“Properties”(属性):
首先,请确保“Channel”(通道)为0,因为S1所连引脚连接到IRQ00。出于相同的原因,将名称更改为g_external_irq00或您喜欢的任何名称。
为中断分配优先级12,启动期间FSP将不会允许该中断。也可以选择任何其他优先级,但开始时最好选择优先级12,因为即使在较大的系统中,也很少会遇到中断优先级冲突。请注意,优先级15是为系统时钟节拍定时器(systick)保留的,因此不应被其他中断使用。
图4-3:堆元素的灰色条表示此驱动程序是模块实例,只能由另一个FSP模块实例引用
将“Trigger”(触发器)从“Rising”(上升)更改为“Falling”(下降)以捕捉按钮激活操作,并将“Digital Filtering”(数字滤波)从“Disabled”(禁用)更改为“Enabled”(启用)。始终将“Digital Filtering Sample Clock”(数字滤波采样时钟)设置为PCLK/64。这将有助于对按钮去抖。最后,用external_irq00_callback替换Callback行中的NULL。每次按下S1都会调用此函数。在稍后创建应用程序时,我们将为回调函数本身添加代码。图4-4 给出了必要设置的摘要。
图4-4:应用程序所需的IRQ驱动程序的属性
现在,只需要执行几个步骤,即可编译和下载程序。下一步是添加信号量。
为此,请在“LED Thread Objects”(LED线程对象)窗格中单击“New Object”(新对象)按钮。如果看到的不是此窗格,而是“HAL/Common Objects”(HAL/通用对象)窗格,则突出显示“Threads”(线程)窗格中的“LED Thread”(LED线程),随即将显示此窗格。添加一个二进制信号量,我们需要在按下按钮时通知LED线程。将信号量的“Symbol”(符号)属性更改为g_s1_semaphore,并将“Memory Allocation”(存储器分配)保留为“Static”(静态)。现在,FSP配置器中的“Stacks”(堆)选项卡的外观应类似于图4-5。
图4-5:这是添加LED线程和信号量后“Stacks”(堆)选项卡应呈现的外观
FSP配置器中的最后一步是将S1连接的I/O引脚配置为IRQ00输入。为此,请激活配置器中的“Pins”(引脚)选项卡,展开“Ports → P1”(端口→P1),然后选择P105。在CPK-RA6M4评估板上,这是S1连接的端口。在右侧的“Pin Configuration”(引脚配置)窗格中,为其指定符号名称SW1,并确保其他设置与图4-6中的设置相同。通常,配置器应该已为您完成了相关设置。如果没有完成,请相应调整。请注意,右侧的封装查看器将突出显示引脚103/P105,这样便可获得引脚位置的图形参考。
图4-6:应已为IRQ00正确配置了端口P105
完成此操作后,即完成了配置器中的设置。保存更改,然后单击其顶部的“Generate Project Content”(生成项目内容)图标以创建必要的文件、文件夹和设置。
需要执行的最后一项任务是添加初始化Leds结构体所需的代码,编写几行代码来切换LED并读取信号量,然后创建将设置信号量的回调函数。可以在本章末尾查看完整代码。
由于我们正在使用LED线程处理按钮和切换LED的状态,因此本次需要将相关代码添加到led_thread_entry.c文件中。在“Project Explorer”(项目资源管理器)中双击文件名以在编辑器中将其打开。如果未显示文件,请展开项目文件夹,然后展开src录。与第3章中的练习一样,为LED添加结构体并对其进行初始化。需要定义用户LED(红色)所连I/O引脚的电平的另一个变量。将其命名为led_level。该变量的类型需要采用ioport_level_t,并且应初始化为IOPORT_LEVEL_HIGH(在CPK-RA6M4上,“高”电平对应于“开启”)。
下一步将是打开并启用连接到板上S1的IRQ00。为此,请使用IRQ FSP驱动程序的打开和使能功能。完成后,初始化即完成。
在while(1)循环内部,需要添加一些语句并删除vTaskDelay(1);语句。先使用函数调用将led_level的值写入用户LED(红色)的I/O引脚的输出寄存器,然后执行相关语句切换该引脚的电平。
有几种方法可以实现这一点。自行实现,回顾第3章的练习或查看本章结尾的代码。不要忘记e2 studio的智能手册功能,它会提供很大帮助!
While(1)循环中的最后一条语句是调用xSemaphoreTake(),将信号量的地址和常量portMAX_DELAY作为参数。后i一个参数将通知RTOS无限期地暂停线程,直到从IRQ00中断服务程序调用的回调函数中释放信号量为止。
最后要执行的操作是添加回调函数本身。该函数应尽可能短,因为它将在中断服务程序的上下文中执行。编写此函数十分简单:只需转到“Project Explorer”(项目资源管理器)中的“Developer Assistance →LED Thread → g_external_irq00 External IRQ Driver on r_icu”(开发人员帮助 →LED线程 → r_icu 上的g_external_irq00外部IRQ驱动程序),然后将所出现列表末尾的回调函数定义拖放到源文件中。
在回调函数内,添加以下两行代码:
第一行中的宏将告知编译器回调函数不使用参数p_args,从而避免编译器发出警告,而第二行中的宏则在每次按下按钮S1时释放信号量。注意,必须使用give系列函数的中断保存版本,因为此函数调用发生在ISR的上下文内。此调用的第二个参数是*pxHigherPriorityTaskWoken。如果可能有一个或多个任务由于信号量发生阻塞并等待该信号量变为可用状态,并且其中一个任务的优先级高于发生中断时执行的任务,则此参数将在调用xSemaphoreGiveFromISR()后变为true。在这种情况下,应在退出中断之前执行上下文切换。由于在我们的示例中,没有其他任务依赖于此信号量,因此可以将此参数设置为NULL。
完成所有代码编写后,单击“Build”(编译)图标(“锤子”),编译项目。如果编译后存在错误,请返回程序,借助“Problems”(问题)视图中显示的编译器反馈修复问题。
如果项目编译成功,请单击“Debug”(调试)图标旁的小箭头,选择“Debug Configurations”(调试配置),然后展开“Renesas GDB Hardware Debugging”(瑞萨GDB硬件调试)。选择MyRtosProject Debug_Flat,或者为项目指定的名称,然后单击“Debug”(调试)。这样便可启动调试器。如果您需要更多相关信息,请回顾第3章中的相关部分。调试器启动并运行后,单击“Resume”(恢复)两次。现在程序正在执行,每次按下CPK上的S1时,用户LED(红色)都应切换状态。
最后一点:在实际应用中,应执行错误检查以确保程序正确运行。为了清楚和简洁起见,本示例中将其省略。
您已成功完成本练习!
本章要点
通过使用全面的API,可以轻松使用FSP的各个函数。
FSP将处理大多数与用户代码无关的内容。
使用FreeRTOS十分简单,因为FSP配置器的使用非常直观,添加线程和信号量也相当轻松。
审核编辑:汤梓红
-
mcu
+关注
关注
146文章
17123浏览量
350973 -
瑞萨
+关注
关注
35文章
22308浏览量
86238 -
评估板
+关注
关注
1文章
537浏览量
29304 -
RA6M4
+关注
关注
0文章
51浏览量
441
原文标题:CPK-RA6M4评估板入门指南-第4章
文章出处:【微信号:瑞萨MCU小百科,微信公众号:瑞萨MCU小百科】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论