《瑞萨RA产品家族初学者指南》系列文章已收录成合集,欢迎点击上方查看合集并订阅!
9. 使用实时操作系统
本章目录
9.2 使用e2 studio将线程添加到FreeRTOS中
接下来,只需要执行几个步骤,即可编译和下载程序。
添加信号量。请在“LED Thread Objects”(LED线程对象)窗格中单击“New Object”(新对象)按钮。如果看到的不是此窗格,而是“HAL/Common Objects”(HAL/通用对象)窗格,则突出显示“Threads”(线程)窗格中的“LED Thread”(LED线程),随即将显示此窗格。
添加一个二进制信号量,我们需要在按下按钮时通知LED线程。将信号量的“Symbol”(符号)属性更改为g_s1_semaphore,并将“Memory Allocation”(存储器分配)保留为“Static”(静态)。现在,FSP配置器中的“Stacks”(堆)选项卡的外观应类似于图9-5。
图9-5:这是添加LED线程和信号量后“Stacks”(堆)选项卡应呈现的外观
FSP配置器中的最后一步是将S1连接的I/O引脚配置为IRQ10输入。为此,请激活配置器中的“Pins”(引脚)选项卡,展开“Ports → P0”(端口 → P0),然后选择P005。在RA6M4评估板上,这是S1连接的端口。在右侧的“Pin Configuration”(引脚配置)窗格中,为其指定符号名称S1,并确保其他设置与图9-6中的设置相同。通常,配置器应该已为您完成了相关设置。如果没有完成,请相应调整。请注意,右侧的封装查看器将突出显示引脚135/P005,这样便可获得引脚位置的图形参考。
图9-6:应已为IRQ10正确配置了端口P005
完成此操作后,即完成了配置器中的设置。保存更改,然后单击其顶部的“Generate Project Content”(生成项目内容)图标以创建必要的文件、文件夹和设置。
需要执行的最后一项任务是添加初始化Leds结构体所需的代码,编写几行代码来切换LED并读取信号量,然后创建将设置信号量的回调函数。可以在本章末尾查看完整代码。
由于我们正在使用LED线程处理按钮和切换LED,因此本次需要将相关代码添加到led_thread_entry.c文件中。在“Project Explorer”(项目资源管理器)中双击文件名以在编辑器中将其打开。如果未显示文件,请展开项目文件夹,然后展开src目录。与第8章中的练习一样,为LED添加结构体并对其进行初始化。需要定义LED2所连I/O引脚的电平的另一个变量。将其命名为led_level。该变量的类型需要采用ioport_level_t,并且应初始化为IOPORT_LEVEL_HIGH(在EK-RA6M4上,“高”电平对应于“开启”)。
下一步将是打开并启用连接到板上S1的IRQ10。为此,请使用IRQ FSP驱动程序的打开和使能功能。完成后,初始化即完成。
在while(1)循环内部,需要添加一些语句并删除vTaskDelay(1); 语句。先使用函数调用将led_level的值写入LED2的I/O引脚的输出寄存器,然后执行相关语句切换该引脚的电平。有几种方法可以实现这一点。自行实现,回顾第8章的练习或查看本章结尾的代码。不要忘记e2 studio的智能手册功能,它会提供很大帮助!
While(1)循环中的最后一条语句是调用xSemaphoreTake(),将信号量的地址和常量portMAX_DELAY作为参数。后一个参数将通知RTOS无限期地暂停线程,直到从IRQ 10中断服务程序调用的回调函数中释放信号量为止。
最后要执行的操作是添加回调函数本身。该函数应尽可能短,因为它将在中断服务程序的上下文中执行。编写此函数十分简单:只需转到“Project Explorer”(项目资源管理器)中的“Developer Assistance → LED Thread → g_external_irq10 External IRQ Driver on r_icu”(开发人员帮助 → LED线程 → r_icu 上的g_external_irq10外部IRQ驱动程序),然后将所出现列表末尾的回调函数定义拖放到源文件中。
在回调函数内,添加以下两行代码:
第一行中的宏将告知编译器回调函数不使用参数p_args,从而避免编译器发出警告,而第二行中的宏则在每次按下按钮S1时释放信号量。注意,必须使用give系列函数的中断保存版本,因为此函数调用发生在ISR的上下文内。此调用的第二个参数是*pxHigherPriorityTaskWoken。如果可能有一个或多个任务由于信号量发生阻塞并等待该信号量变为可用状态,并且其中一个任务的优先级高于发生中断时执行的任务,则此参数将在调用xSemaphoreGiveFromISR()后变为true。在这种情况下,应在退出中断之前执行上下文切换。由于在我们的示例中,没有其他任务依赖于此信号量,因此可以将此参数设置为NULL。
完成所有代码编写后,单击“Build”(编译)图标(“锤子”),编译项目。如果编译后存在错误,请返回程序,借助“Problems”(问题)视图中显示的编译器反馈修复问题。
如果项目编译成功,请单击“Debug”(调试)图标旁的小箭头,选择“Debug Configurations”(调试配置),然后展开“Renesas GDB Hardware Debugging”(瑞萨GDB硬件调试)。选择MyRtosProject Debug_Flat,或者为项目指定的名称,然后单击“Debug”(调试)。这样便可启动调试器。如果您需要更多相关信息,请回顾第8章中的相关部分。调试器启动并运行后,单击“Resume”(恢复)两次。现在程序正在执行,每次按下EK上的S1时,绿色LED2都相应切换。
最后一点:在实际应用中,应执行错误检查以确保程序正确运行。为了清楚和简洁起见,本示例中将其省略。
第9章 结束
原文标题:瑞萨RA产品家族初学者指南-第9章(2)
文章出处:【微信公众号:瑞萨MCU小百科】欢迎添加关注!文章转载请注明出处。
-
mcu
+关注
关注
146文章
17148浏览量
351186 -
瑞萨
+关注
关注
35文章
22309浏览量
86305
原文标题:瑞萨RA产品家族初学者指南-第9章(2)
文章出处:【微信号:瑞萨MCU小百科,微信公众号:瑞萨MCU小百科】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论