AG32 下使用freeRTOS 的参考

1 min read CPLD

在 SDK 下已经有移植好的FreeRTOS Kernel V10.4.6 版本,可供用户使用。 源码位于:\AgRV_pio\packages\framework-agrv_freertos\

用户使用时,不必关注该源码,只需关注API使用即可。

一 、简单验证:

使用时,从 VSCODE 中直接打开工程:\AgRV_pio\platforms\AgRV\examples\freeRTOS 打开工程后,可以先验证简单的运行情况。

这个工程中,并没有ve 文件(而是使用了默认的ve 文 件 ) 。

便于后续开发,可以先建立一份ve。

步骤:

1. 从 example 路径下 copy 一 份 example_board.ve 过来;

2. 打开该example_board.ve, 删除掉里边除clk 和 led 灯以外的其他引脚配置;

3. 在 platformio.ini 中添加对该 ve 的引用: board_logic.ve =example_board.ve

接下来,编译ve 并烧录,然后编译code 并烧录。

两项都烧录成功后,就可以看到led灯的闪烁了。

二 、使用样例:

打 开main.c,可以看到在main 函数中使用了几种元素:xQueue、xSemaphore、xTask、xTimer。 同时在main.c中对接的hook 回调中,会配合使用这些元素。

这里注意,如果要精简样例,比如只跑一个 task 时,删除其他元素时,要同时把hook 里对 应的调用也删除。

main() 函数中,可精简到调用3个函数:

int main(void)

{

prvSetupHardware();

xTaskCreate(led_task,

“led_task”,

configMINIMAL_STACK_SIZE,

NULL,

mainEVENT_SEMAPHORE_TASK_PRIORITY, &xGPTimerTask);

vTaskStartScheduler();

for(;);

其 中 ,prvSetupHardware()函数中有 init 函数是必须的:

 

 

在 led_task 中可写闪灯代码如下:

 

 

另外,由于不再使用xEventSemaphore, 也需要在vApplicationTickHook 中去除对xSemaphore 的操作:

 

 

可尝试编译运行,查看效果。

除了以上简化过程,还有用户会使用到 freeRTOS 的静态方法。

如果使用静态方法,即打开了宏: configSUPPORT_STATIC_ALLOCATION, 需 要 新 增 两 个hook

函数,可参考: https://blog.csdn.net/m046451722/article/details/113053257 中 的 描述 。

使用如:

 

 

编译通过后,可在函数中使用 static那组函数。

用法和动态那组函数相似,注意参数使用静态分配好的即可。

三 、使用自建工程:

如果用户希望在自建工程中使用 freeRTOS, 该如何把它添加进来?

比 如 , 在example 下 要 把 freeRTOS 加进来。步骤:

1. 在 platformio.ini 中 增 加 对 freertos的 引 用 :

 

 

注意,多个库之间用“逗号+空格”来隔开。

2. 确 认ve 文 件 里 的 配 置 正 常 ( 时 钟 +led 引 脚 ) ;

3. 在 example.c 中 引 入 freertos的头文件及用到的宏定义:

 

 

4. 在 example.c 中新增几个函数:

 

 

5. 在 main.c中 init 后直接启动freeRTOS:

 

 

然后,编译ve 并烧录,再编译code 并烧录,就可以看到led 的闪烁了。

这篇文档有帮助吗?