树莓派Pico开发板片上主芯片为RP2040单片机,双核 Arm Cortex-M0 + 处理器,工作主频为133MHz,264K片上SRAM,和2MByteFlash。
这么大的RAM和Flash资源,不跑一下RTOS操作系统实在有些可惜,这次就先体验一下FreeRTOS,也为后续项目做一些准备。
一、项目创建
1、按照前文“轻松玩转树莓派Pico之二、创建自己的pico工程项目”一文创建pico_freertos_project项目。
创建pico-freertos.c,并输入:
#include <stdio.h>
#include "pico/stdlib.h"
int main()
{
setup_default_uart();
while(1) {
printf("Hello World!\r\n");
sleep_ms(1000);
}
return 0;
}
2、创建项目CMakeLists.txt
cmake_minimum_required(VERSION 3.13)
include(pico_sdk_import.cmake)
project(PICO_FREERTOS_PROJECT C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
pico_sdk_init()
add_executable(PICO_FREERTOS_PROJECT
pico-freertos.c
)
pico_add_extra_outputs(PICO_FREERTOS_PROJECT)
target_link_libraries(PICO_FREERTOS_PROJECT pico_stdlib)
3、在项目pico_freertos_project目录下依次输入:
mkdir build && cd build
cmake ..
make
测试是否可以正常编译
二、下载FreeRTOS内核源代码
1、在命令行中输入:
git submodule add https://github.com/FreeRTOS/FreeRTOS-Kernel FreeRTOS/FreeRTOS-Kernel
下载完成后,可看到项目目录下会出现FreeRTOS/FreeRTOS-Kernel两级目录。
其中:
(1)FreeRTOS目录用于存放项目需要与RTOS相关的一些文件
(2)FreeRTOS-Kernel目录为FreeRTOS内核源码
2、在FreeRTOS目录下新建include目录,复制FreeRTOSConfig.h至include目录下。
3、在FreeRTOS目录下下新增CMakeLists.txt,不使用FreeRTOS自带的CMake脚本。
在CMakeLists.txt中输入:
add_library(FreeRTOS STATIC
FreeRTOS-Kerne/event_groups.c
FreeRTOS-Kerne/list.c
FreeRTOS-Kerne/queue.c
FreeRTOS-Kerne/stream_buffer.c
FreeRTOS-Kerne/tasks.c
FreeRTOS-Kerne/timers.c
FreeRTOS-Kerne/portable/GCC/ARM_CM0/port.c
FreeRTOS-Kerne/portable/MemMang/heap_4.c
)
target_include_directories(FreeRTOS PUBLIC include FreeRTOS-Kerne/include FreeRTOS-Kerne/portable/GCC/ARM_CM0)
Pico开发板上芯片为RP2040,Cortex-M0双核,当前只使用单核,使用portable/GCC/ARM_CM0下的适配文件。
4、修改pico-freertos.c文件
#include "FreeRTOS.h"
#include "task.h"
void vTaskCode( void * pvParameters )
{
/* The parameter value is expected to be 1 as 1 is passed in the
pvParameters value in the call to xTaskCreate() below.
configASSERT( ( ( uint32_t ) pvParameters ) == 1 );
*/
const uint LED_PIN = PICO_DEFAULT_LED_PIN;
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
for( ;; )
{
printf("Hello World!\r\n");
vTaskDelay(500);
gpio_put(LED_PIN, 1);
vTaskDelay(500);
gpio_put(LED_PIN, 0);
}
}
int main()
{
setup_default_uart();
BaseType_t xReturned;
TaskHandle_t xHandle = NULL;
/* Create the task, storing the handle. */
xReturned = xTaskCreate(
vTaskCode, /* Function that implements the task. */
"Blinky task", /* Text name for the task. */
512, /* Stack size in words, not bytes. */
( void * ) 1, /* Parameter passed into the task. */
tskIDLE_PRIORITY,/* Priority at which the task is created. */
&xHandle );
vTaskStartScheduler();
return 0;
}
5、修改pico_freertos_project项目下的CMakeLists.txt,加入以下内容
pico_add_extra_outputs(PICO_FREERTOS_PROJECT)
target_link_libraries(PICO_FREERTOS_PROJECT pico_stdlib FreeRTOS cmsis_core)
add_subdirectory(FreeRTOS)
三、编译
在项目pico_freertos_project目录下依次输入:
cd build
cmake ..
make
四、运行
1、根据“轻松玩转树莓派Pico之四、Ubuntu下在线debug环境搭建”流程,搭建完成Pico VSCode可视化在线debug环境。
2、在线运行:
特别注意,需要先设置一下USB权限,否则会运行失败。
sudo chmod -R 777 /dev/bus/usb/
可以看到Pico开发板上的led指示灯以500ms亮/500ms灭的频率循环。