port.c文件中重点实现堆栈初始化函数pxPortInitialiseStack(),启动FreeRTOS调度器时特定的处理函数xPortStartScheduler(),系统时钟节拍定时器初始化函数vPortSetupTimerInterrupt(),以及系统时钟节拍中断服务函数xPortSysTickHandler()。这几个函数分别需要根据RISC-V架构和GD32VF103微控制器硬件特性来实现其功能。
3.2移植测试和验证
验证移植是完全能正常工作采用调试和借助相应的辅助工具来进行。使用IAR EWRISC-V建立项目,在代码中创建两个以上任务进行调试,代码调试时需要验证:
1、通过在系统时钟节拍ISR和软件中断ISR中添加断点,结合RISC-V的mtime和mcycle寄存器验证系统时钟节拍正确产生,且软件中断能够正常触发。
2、启动第一个任务时,通过添加断点,查看从任务堆栈中恢复的寄存器内容是否跟堆栈初始化时写入的内容一致,从而测试pxPortInitialiseStack()和vPortStartFirstTask()函数的工作正确性。
3、在执行任务上下文切换时,在软件中断服务程序中添加加断点,单步执行,同时通过EWRISC-V的memory观察窗口查看压栈到当前任务堆栈中的内容是否跟对应的寄存器内容相同;在恢复下文时,检查从下一个执行任务堆栈中恢复的寄存器内容是否堆栈中的一致。验证eclic_msip_handler()软件中断服务函数的上下文切换正确性。
4、启动第一个任务和任务上下文切换的代码验证能正常工作,移植的FreeRTOS已可以实现基本的任务调度,接着再继续测试开关中断操作和临界区是否正常。测试开关中断需要增加另外一个外设中断,将其优先级别分别设置大于或小于mth阈值进行测试,代码中手动调用开关中断操作API,检测中断触发是否如设计的模式,验证FreeRTOS对中断的控制。同样的方法测试进入和退出临界区。
5、通过FreeRTOS系统服务调用测试,测试系统的各项服务,如信号量,消息队列、事件标志等服务能否正常。并测试在受FreeRTOS管理的ISR中发信号、消息等操作也正确。
基础调试测试都通过之后,已经基本可以验证移植是否成功。在此基础上还可以借助额外的工具继续验证,如EWRISC-V自带的FreeRTOS调试插件显示的信息进行确认。
EWRISC-V RTOS调试插件 – Task窗口
Tracealyzer分析软件的应用移植跟踪记录器库(Trace Recorder library)
Tracealyzer的跟踪记录器库是运行在嵌入式目标端的一个软件库,与FreeRTOS项目集成在一起,负责记录RTOS在运行时的产生的事件。记录的事件如果是存储在位于RAM中的事件缓存,这种工作方式称为快照模式(Snapshot),如果是通过通讯端口实时发送到PC端软件,则工作在流模式(Streaming)。跟踪记录器库跟处理器硬件没有依赖,只需要使用一个高精度的定时器产生时间戳,为记录的事件添加时间信息。
RISC-V架构的处理器可以利用内核的mcycle计数器来产生时间戳,mcycle是一个64位的计数器,对CPU的周期进行计数,所以频率跟CPU时钟相同,精度非常高。mcycle由两个32位的寄存器组成,Tracealyzer只需要使用低32位寄存器。
跟踪并分析FreeRTOS
将Tracealyzer跟踪记录器库添加到EWRISC-V的FreeRTOS项目中,并进行必要的配置,工作在快照模式。在应用代码中创建4个任务,分别为Led1Task~Led3Task、ButtonTask,任务优先级依次递增,运行程序一段时间,将快照数据通过EWRISCV保存成Hex文件并加载到PC端的Tracealyzer中进行分析。
通过水平时间轴视图查看各个任务的执行情况:每个任务或中断占一行,从左向右为时间轴的方向,行中有色矩形为该任务或中断的一次执行实例。由时间轴窗口可以快速的预览整个运行过程中系统的执行情况概览,放大窗口的时间分辨率之后可以仔细了解任务执行时的相关的内核事件和时间信息。
Tracealyzer水平时间轴视图
通过跟踪到的事件和记录的时间戳信息,Tracealyzer能够生成多种视图来观测系统运行时存在的问题,例如设计缺陷导致的线程饥饿,死锁等,以及发现系统中不必要的延迟,帮助开发者解决系统的问题,提高嵌入式系统的实时性。这些问题使用传统调试手段都难以发现,而且效率低。
本文介绍了基于RISC-V指令集微控制器GD32VF103在IAR EWRISCV工具链上移植FreeRTOS的方法和过程,以及对移植的系统进行验证的方法。在此基础上移植Tracealyzer跟踪记录器库,并通过跟踪FreeRTOS系统运行进一步观测系统的运行,并对任务的执行进行了分析。