uC-OS2 V2.93 STM32L476 移植:系统启动篇

前言

  • 前两篇已经 通过 STM32CubeMX 搭建了 NUCLEO-L476RG 的 STM32L476RG 的 裸机工程,下载了 uC-OS2 V2.93 的源码,并把 uC-OS2 的源文件加入 Keil MDK5 工程

  • 本篇适配 uC-OS2 的 系统定时器(Systick)与 PendSV_Handler,创建 用户任务,让 uC-OS2 启动并运行起来

开发环境

  • win10 64位

  • Keil uVision5,MDK V5.36

  • uC-OS2 V2.93

  • 开发板:NUCLEO-L476RG ,MCU 为 STM32L476RG

  • STM32CubeMX 6.9.1,用于生成 STM32的裸机工程

创建用户任务

  • 这里创建一个 led 闪烁的任务,在 main.c 中实现
#include "main.h"
#include "led.h"
#include "app_cfg.h"
#include "os.h"UART_HandleTypeDef huart2;void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);#define TASK_LED_PRIO               5
#define TASK_LED_STACK_SIZE         128
static OS_STK task_led_stack[TASK_LED_STACK_SIZE];static void task_led_entry(void *p_arg)
{while (1){led_grn_ctrl(1);OSTimeDly(1000);led_grn_ctrl(0);OSTimeDly(1000);}
}void led_task_init(void)
{OSTaskCreate(task_led_entry,(void *)0, &task_led_stack[TASK_LED_STACK_SIZE-1], TASK_LED_PRIO);
}HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{return HAL_OK;
}/*** @brief  The application entry point.* @retval int*/
int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART2_UART_Init();OSInit();led_task_init();OS_CPU_SysTickInitFreq(80000000);OSStart();return 0;
}

适配 Systick

  • 工程编译下载后,发现 任务没有正常调度起来,原因是没有适配 uC-OS2

  • 首先需要开启 uC-OS2 的系统定时器,也就是系统的心跳

  • uC-OS2 V2.93 有 Systick 的初始化函数,uC-OS2\Ports\ARM-Cortex-M\ARMv7-M\os_cpu_c.cOS_CPU_SysTickInitFreq

  • 备注: STM32的 HAL库,默认在 HAL_Init 中通过 HAL_InitTick 初始化了 1ms 一次的 Systick

  • 这里首先重新 STM32 HAL 库的 HAL_InitTick,默认是个 weak 函数,可以重新,这里重写为空,也就是不通过 STM32 HAL 库初始化 Systick

HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{return HAL_OK;
}
  • 通过 OS_CPU_SysTickInitFreq(80000000); 初始化 Systick

  • 初始化了 Systick,就要处理一下 Systick 的中断函数: SysTick_Handler,需要调用 uC-OS2 的 OS_CPU_SysTickHandler,修改文件 stm32l476_ucosii_led\Core\Src\stm32l4xx_it.c

#include "app_cfg.h"
#include "os_cpu.h"void SysTick_Handler(void)
{OS_CPU_SysTickHandler();HAL_IncTick();
}
  • 以上的修改, Systick 初始化,Systick 的中断可以周期性的触发

  • 如果发现 Systick 没有按1毫秒触发一次中断,如延时1秒发现时间是 10秒,需要修改 uC-OS2\Cfg\Template\os_cfg.h,修改 OS_TICKS_PER_SEC, 改为 #define OS_TICKS_PER_SEC 1000u,也就是 1毫秒触发一次Systick 中断

适配 PendSV_Handler

  • 像 STM32 系列的芯片,默认通过 PendSV_Handler 中断进行任务的切换,修改文件 stm32l476_ucosii_led\Core\Src\stm32l4xx_it.c 中的 PendSV_Handler
void PendSV_Handler(void)
{OS_CPU_PendSVHandler();
}
  • 注意 stm32l476_ucosii_led\Core\Src\stm32l4xx_it.c 中 包含头文件
#include "app_cfg.h"
#include "os_cpu.h"

编译烧写

  • 编译烧写后,发现开发板的 LED 正常的闪烁, uC-OS2 系统移植初步完成,任务切换、系统延时等正常工作了

  • 可以点击 Keil MDK5 的【Debug】调试按钮,进入 Debug 调试模式,加入【断点】,单步或者连续运行,观察 uC-OS2 的任务调度、切换,用户例程的执行等

调试说明

  • 如果调试发现【断点】不起作用,需要调整 Keil MDK5 的编译优化等级,改为 O0 试试

在这里插入图片描述

在这里插入图片描述

  • 通过软件调试,可以熟悉整个系统的初始化、启动、运行流程

小结

  • 本篇通过适配 uC-OS2 的两个关键的适配: 系统滴答定时器与 PendSV 系统异常,实现 uC-OS2 的正常启动与运行

  • uC-OS2 移植起来相对简单,后面继续研究 uC-OS2,如增加串口输出、移植 Shell 等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/19832.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 763. 划分字母区间

2023.8.3 本题的关键是要确保同一字母需要在同一片段中,而这就需要关注到每个字母最后一次出现的位置。 思路:用一个哈希表保存每个字母(26个)最后一次出现的位置。然后从头遍历,不断更新最右边界,直到当前…

Java电子招投标采购系统源码-适合于招标代理、政府采购、企业采购、等业务的企业 tbms

​ 功能描述 1、门户管理:所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含:招标公告、非招标公告、系统通知、政策法规。 2、立项管理:企业用户可对需要采购的项目进行立项申请,并提交审批,查…

[数据分析与可视化] Python绘制数据地图4-MovingPandas入门指北

MovingPandas是一个基于Python和GeoPandas的开源地理时空数据处理库,用于处理移动物体的轨迹数据。它提供了一组强大的工具,可以轻松地加载、分析和可视化移动物体的轨迹。通过使用MovingPandas,用户可以轻松地处理和分析移动对象数据&#x…

[JAVA基础]自动拆装箱NPE问题

1.自动拆装箱场景 自动装箱 当把字面量转换成包装类的时候会自动装箱 比如: Integer a 1; Integer b 1; 自动拆箱 当你对包装类的对象进行运算(如加法、减法等)时,Java会自动进行拆箱操作。拆箱是将包装类型的对象转换为相应的基…

登月再进一步:Apollo自动驾驶的里程碑

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★前端炫酷代码分享 ★ ★ uniapp-从构建到提升★ ★ 从0到英雄,vue成神之路★ ★ 解决算法,一个专栏就够了★ ★ 架…

数据结构 | 递归

目录 一、何谓递归 1.1 计算一列数之和 1.2 递归三原则 1.3 将整数转换成任意进制的字符串 二、栈帧:实现递归 三、递归可视化 四、谢尔平斯基三角形 五、复杂的递归问题 六、动态规划 一、何谓递归 递归是解决问题的一种办法,它将问题不断地分…

Google Colab 部署 Stable Diffusion Webui

1. 下载 vae 访问: https://huggingface.co/stabilityai/sd-vae-ft-mse-original/blob/main/vae-ft-mse-840000-ema-pruned.ckpt 根据下图的红圈部分,点击下载。 将其上传至GoogleDrive根目录 点击新建后,然后点击上传文件。 2. 访问 colab 首先第一步…

数据结构——单链表

无头单向非循环链表的建立 前言——什么链表链表形象图链表分类 一、Single_linked_list.h头文件的建立二、Single_linked_list.c功能函数的定义Single_linked_list_test.c主函数的定义四、代码运行测试五、Single_linked_list完整代码演示:总结 前言——什么链表 链…

一条自由游动的鲸鱼

先看效果&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>鲸鱼</title><style>#canvas-container {width: 100%;height: 100vh;overflow: hidden;}&l…

HTML之表单标签

目录 表单标签 Form表单 定义&#xff1a; 基本语法结构&#xff1a; form属性&#xff1a; enctyoe属性 fieldeset标签 fieldeset属性 legend标签 label标签 优势 label属性 input标签 input属性 input标签中的type属性 text text输入框有以下配套属性 searc bu…

太魔幻了!计算机就业哀鸿遍野,而高考生疯狂涌向计算机专业

在张雪峰推荐的几大专业里&#xff0c;计算机专业是其中之一。近几年&#xff0c;计算机专业报考热度不减&#xff0c;但就业前景却令人堪忧&#xff0c;互联网裁员接二连三&#xff0c;许多码农找不到工作。 一位网友感叹&#xff1a;一边是计算机就业哀鸿遍野&#xff0c;一…

IDEA中怎么使用git下载项目到本地,通过URL克隆项目(gitee\github)

点击 新建>来自版本控制的项目 点击后会弹出这样一个窗口 通过URL拉取项目代码 打开你要下载的项目仓库 克隆>复制 gitee github也是一样的 返回IDEA 将刚刚复制的URL粘贴进去选择合适的位置点击克隆 下载完成

Mac电脑目录

System&#xff08;系统&#xff09;Applications&#xff08;应用程序&#xff09;应用程序目录&#xff0c;默认所有的GUI应用程序都安装在这里User&#xff08;用户&#xff09;存放用户的个人资料和配置。每个用户有自己的单独目录Library&#xff08;资料库&#xff09;系…

Android的Handler消息通信详解

目录 背景 1. Handler基本使用 2. Handler的Looper源码分析 3. Handler的Message以及消息池、MessageQueue 4. Handler的Native实现 4.1 MessageQueue 4.2 Native结构体和类 4.2.1 Message结构体 4.2.2 消息处理类 4.2.3 回调类 4.2.5 ALooper类 5. 总结&…

基于fpga_EP4CE6F17C8_秒表计数器

文章目录 前言实验手册一、实验目的二、实验原理1&#xff0e;理论原理2&#xff0e;硬件原理 三、系统架构设计四、模块说明1&#xff0e;模块端口信号列表dig_driver(数码管驱动模块)key(按键消抖模块)top(顶层模块) 2&#xff0e;状态转移图3&#xff0e;时序图五、仿真波形…

目标检测与跟踪 (2)- YOLO V8配置与测试

系列文章目录 第一章 目标检测与跟踪 &#xff08;1&#xff09;- 机器人视觉与YOLO V8 目标检测与跟踪 &#xff08;1&#xff09;- 机器人视觉与YOLO V8_Techblog of HaoWANG的博客-CSDN博客3D物体实时检测、三维目标识别、6D位姿估计一直是机器人视觉领域的核心研究课题&a…

7.物联网操作系统互斥信号量

1.使用互斥信号量解决信号量导致的优先级反转&#xff0c; 2.使用递归互斥信号量解决互斥信号量导致的死锁。 3.高优先级主函数中多次使用同一信号量的使用&#xff0c;使用递归互斥信号量&#xff0c;但要注意每个信号量的使用要对应一个释放 优先级翻转问题 优先级翻转功能需…

gateway过滤器没生效,特殊原因

看这边文章的前提&#xff0c;你要会gateway&#xff0c;知道过滤器怎么配置&#xff1f; 直接来看过滤器&#xff0c;局部过滤器 再来看配置 请求路径 http://127.0.0.1:8080/appframework/services/catalog/catalogSpecials.json?pageindex1&pagesize10&pkidd98…

网络安全知识点整理(作业2)

目录 一、js函数声明->function 第一种 第二种 第三种 二、this关键字 this使用场合 1.全局环境 2.构造函数 3.对象的方法 避免多层this 三、js的同步与异步 定时器 setTimeout和setInterval 同步与异步的例子 四、宏任务与微任务 分辨宏任务与微任务 一、js…

深入解析项目管理中的用户流程图

介绍用户流程图 用户流程图的定义 用户流程图(User Flow Diagram)是一种可视化工具&#xff0c;它描绘了用户在应用或网站上完成任务的过程。这些任务可以是购物、注册账户、查找信息等&#xff0c;任何需要用户交互的动作都可以在用户流程图中找到。 用户流程图的重要性 用…