RTT学习笔记8-RTT内核移植

article/2025/8/27 1:29:00

RTT 内核移植接口

在这里插入图片描述

CortexM系列的内核移植

1.关闭中断

;/*
; * rt_base_t rt_hw_interrupt_disable(void);
; */
rt_hw_interrupt_disable    PROC      ;PROC 伪指令定义函数EXPORT  rt_hw_interrupt_disable  ;EXPORT 输出定义的函数,类似于 C 语言 externMRS     r0, PRIMASK              ; 读取 PRIMASK 寄存器的值到 r0 寄存器CPSID   I                        ; 关闭全局中断BX      LR                       ; 函数返回ENDP                             ;ENDP 函数结束

2.打开中断

;/*
; * void rt_hw_interrupt_enable(rt_base_t level);
; */
rt_hw_interrupt_enable    PROC      ; PROC 伪指令定义函数EXPORT  rt_hw_interrupt_enable  ; EXPORT 输出定义的函数,类似于 C 语言 externMSR     PRIMASK, r0             ; 将 r0 寄存器的值写入到 PRIMASK 寄存器BX      LR                      ; 函数返回ENDP                            ; ENDP 函数结束

3.线程栈初始化

rt_uint8_t *rt_hw_stack_init(void       *tentry,void       *parameter,rt_uint8_t *stack_addr,void       *texit)
{struct stack_frame *stack_frame;rt_uint8_t         *stk;unsigned long       i;/* 对传入的栈指针做对齐处理 */stk  = stack_addr + sizeof(rt_uint32_t);stk  = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stk, 8);stk -= sizeof(struct stack_frame);/* 得到上下文的栈帧的指针 */stack_frame = (struct stack_frame *)stk;/* 把所有寄存器的默认值设置为 0xdeadbeef */for (i = 0; i < sizeof(struct stack_frame) / sizeof(rt_uint32_t); i ++){((rt_uint32_t *)stack_frame)[i] = 0xdeadbeef;}/* 根据 ARM  APCS 调用标准,将第一个参数保存在 r0 寄存器 */stack_frame->exception_stack_frame.r0  = (unsigned long)parameter;/* 将剩下的参数寄存器都设置为 0 */stack_frame->exception_stack_frame.r1  = 0;                 /* r1 寄存器 */stack_frame->exception_stack_frame.r2  = 0;                 /* r2 寄存器 */stack_frame->exception_stack_frame.r3  = 0;                 /* r3 寄存器 *//* 将 IP(Intra-Procedure-call scratch register.) 设置为 0 */stack_frame->exception_stack_frame.r12 = 0;                 /* r12 寄存器 *//* 将线程退出函数的地址保存在 lr 寄存器 */stack_frame->exception_stack_frame.lr  = (unsigned long)texit;/* 将线程入口函数的地址保存在 pc 寄存器 */stack_frame->exception_stack_frame.pc  = (unsigned long)tentry;/* 设置 psr 的值为 0x01000000L,表示默认切换过去是 Thumb 模式 */stack_frame->exception_stack_frame.psr = 0x01000000L;/* 返回当前线程的栈地址       */return stk;
}

3. 实现上下文切换

1) rt_hw_context_switch_to():没有来源线程,切换到目标线程,在调度器启动第一个线程的时候被调用。

2) rt_hw_context_switch():在线程环境下,从当前线程切换到目标线程。

3) rt_hw_context_switch_interrupt ():在中断环境下,从当前线程切换到目标线程。

  • 在线程环境下,可以马上进行上下文切换;
  • 而在中断环境下,需要等待中断处理函数完成之后才能进行切换。

3.1在 Cortex-M 上下文切换

线程A运行过程中产生PendSV中断,进入中断函数之前硬件保存当前线程的 PSR、PC、LR、R12、R3-R0 ,进入中断函数后软件/手动保存 R11~R4 寄存器,接下来恢复线程B的R11~R4 寄存器,退出中断,硬件完成线程B的 R0~R3、R12、LR、PC、PSR 寄存器
在这里插入图片描述

3.2只有目标线程,没有来源线程的线程切换

rt_hw_context_switch_to()
在这里插入图片描述

;/*
; * void rt_hw_context_switch_to(rt_uint32_t to);
; * r0 --> to
; * this fucntion is used to perform the first thread switch
; */
rt_hw_context_switch_to    PROCEXPORT rt_hw_context_switch_to; r0 的值是一个指针,该指针指向 to 线程的线程控制块的 SP 成员; 将 r0 寄存器的值保存到 rt_interrupt_to_thread 变量里LDR     r1, =rt_interrupt_to_threadSTR     r0, [r1]; 设置 from 线程为空,表示不需要从保存 from 的上下文LDR     r1, =rt_interrupt_from_threadMOV     r0, #0x0STR     r0, [r1]; 设置标志为 1,表示需要切换,这个变量将在 PendSV 异常处理函数里切换的时被清零LDR     r1, =rt_thread_switch_interrupt_flagMOV     r0, #1STR     r0, [r1]; 设置 PendSV 异常优先级为最低优先级LDR     r0, =NVIC_SYSPRI2LDR     r1, =NVIC_PENDSV_PRILDR.W   r2, [r0,#0x00]       ; readORR     r1,r1,r2             ; modifySTR     r1, [r0]             ; write-back; 触发 PendSV 异常 (将执行 PendSV 异常处理程序)LDR     r0, =NVIC_INT_CTRLLDR     r1, =NVIC_PENDSVSETSTR     r1, [r0]; 放弃芯片启动到第一次上下文切换之前的栈内容,将 MSP 设置启动时的值LDR     r0, =SCB_VTORLDR     r0, [r0]LDR     r0, [r0]MSR     msp, r0; 使能全局中断和全局异常,使能之后将进入 PendSV 异常处理函数CPSIE   FCPSIE   I; 不会执行到这里ENDP

3.2 从一个线程到另外一个线程的切换和中断内部的线程切换

rt_hw_context_switch()/ rt_hw_context_switch_interrupt()

;/*
; * void rt_hw_context_switch(rt_uint32_t from, rt_uint32_t to);
; * r0 --> from
; * r1 --> to
; */
rt_hw_context_switch_interruptEXPORT rt_hw_context_switch_interrupt
rt_hw_context_switch    PROCEXPORT rt_hw_context_switch; 检查 rt_thread_switch_interrupt_flag 变量是否为 1; 如果变量为 1 就跳过更新 from 线程的内容LDR     r2, =rt_thread_switch_interrupt_flagLDR     r3, [r2]CMP     r3, #1BEQ     _reswitch; 设置 rt_thread_switch_interrupt_flag 变量为 1MOV     r3, #1STR     r3, [r2]; 从参数 r0 里更新 rt_interrupt_from_thread 变量LDR     r2, =rt_interrupt_from_threadSTR     r0, [r2]_reswitch; 从参数 r1 里更新 rt_interrupt_to_thread 变量LDR     r2, =rt_interrupt_to_threadSTR     r1, [r2]; 触发 PendSV 异常,将进入 PendSV 异常处理函数里完成上下文切换LDR     r0, =NVIC_INT_CTRLLDR     r1, =NVIC_PENDSVSETSTR     r1, [r0]BX      LR

4.实现时钟节拍

void SysTick_Handler(void)
{/* enter interrupt */rt_interrupt_enter();rt_tick_increase();/* leave interrupt */rt_interrupt_leave();
}

http://chatgpt.dhexx.cn/article/X2nhewrg.shtml

相关文章

nordic 52832中添加RTT打印

JlinkRTT RTT是基于Jlink调试器的实时传输技术,可以代替串口打印一些调试信息,不需要额外接线。 nordic 52832官方例程中,会将RTT打印函数做进一步封装,下面就讲一下怎么开启52832中的RTT打印。 第一步 增加RTT代码 RTT源代码可以在segger官方网站下载,也可以在nordic 5…

计算机网络传输层——学习笔记

目录 传输层概述 多路复用和多路分解 协议 UDP协议 可靠数据传输协议&#xff08;reliable data transfer protocol RDT&#xff09; 经完全可靠信道的可靠数据传输&#xff1a;rdt 1.0 经具有比特差错信道的可靠数据传输&#xff1a;rdt 2.0 经具有比特差错的丢包信道的…

RTT简介及其简单应用

一、 裸机系统和多任务系统 裸机系统通常分为轮询系统和前后台系统。 轮询系统不难理解就是按照顺序从上往下反复来执行&#xff0c;伪代码如下&#xff1a; int main() {Init();while(1){/*事件1*/event1();/*事件2*/event2();/*事件3*/event3();} }前后台系统就是在轮询系统…

TCP中RTT时延的理解

最近服务器环境部署了tcprtt网络时延监控&#xff0c;发现不同服务器不同节点之间的RTT时延表象非常奇怪&#xff0c;无法准确的判断服务器的网络情况。因此需要弄清楚什么是RTT&#xff0c;以及能否作为服务器网络性能的检测指标。 1、RTT是什么&#xff1f; TCP中的RTT指的是…

FreeRTOS记录(四、FreeRTOS任务堆栈溢出问题和临界区)

本来计划是消息队列、信号量、任务通知、事件集、邮件的文章 但是因为自己调试的时候遇到了一个问题&#xff0c;还是把堆栈溢出问题放到前面来说 ..增加临界区的使用说明 2021/11/7 ..临界区的使用部分增加任务挂起与临界区说明 2021/11/26目录 任务…

1-FreeRTOS入门指南

本专栏是根据官方提供的文档进行FreeRTOS的各个功能函数的说明&#xff0c;以及函数的使用 本专栏不涉及动手操作&#xff0c;只是对原理进行说明&#xff0c;FreeRTOS基础知识篇更新完成会对如何在开发板上进行上手实战操作。 这里不会对比其他RTOS的优缺点&#xff0c;因为每…

freeRTOS调度

freeRTOS调度策略 背景 嵌入式的设备开发通常有两种模式&#xff1a;裸机开发和OS开发。像功能较为强大的SOC通常都会先一直linux或其他OS然后进行业务逻辑的开发&#xff1b;而单片机则有很多简单的应用场景直接使用裸机开发的模式&#xff0c;稍微复杂些的场景&#xff0c;会…

FreeRTOS 解析

目录 Task Task State Task Priority Idle Task Run Time Statistics Task Scheduling Single-core 单核处理器 AMP 非对称多核处理器 SMP 对称多核处理器 Context Switch Inter-task Communication and Synchronization Queue 队列 Binary Semaphore 二值信号量 …

FreeRTOS队列

在实际的应用中&#xff0c;常常会遇到一个任务或者中断服务需要和另外一个任务进行“沟通交流”&#xff0c;这个“沟通交流”的过程其实就是消息传递的过程。在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式&#xff0c;但是如果在使用操作系统的应用中…

FreeRTOS任务状态

1. 任务状态介绍 FreeRTOS中的任务状态&#xff0c;可以简单的分为运行态&#xff08;running&#xff09;和非运行态&#xff08;not running&#xff09;。 但是对于非运行态我们还可以继续细分&#xff1a; 阻塞状态&#xff08;Blocked&#xff09;暂停&#xff08;挂起…

FreeRTOS延时

1、相对延时函数 将当前任务添加到阻塞列表pxDelayedTaskList&#xff0c;任务进入阻塞态。 vTaskDelay → prvAddCurrentTaskToDelayedList → vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xStateListItem ) )。任务的阻塞时间更新到状态列表项xStateListItem x…

FreeRTOS多任务管理

文章目录 1、任务1.1 任务简介1.2 任务调度1.3 任务的状态 (就绪态 / 运行态 / 阻塞态 / 挂起态)1.4 空闲任务 2、动态创建两个任务2.1 定义动态内存空间的堆2.2 定义任务函数2.3 定义 任务控制块 指针2.4 动态创建任务 xTaskCreate()2.5 启动任务 vTaskStartScheduler() 3、常…

FreeRTOS 移植

源码 FreeRTOS源码 选择 FreeRTOS 的最新版本 V9.0.0&#xff08;2016 年&#xff09;比较稳定 1&#xff09;解压后的文件 提取的文件&#xff0c; FreeRTOS—>Source->portable目录下的MemMang&#xff0c;RVDS MemMang 存放内存相关的源文件,heap_1.c,heap_2.c,he…

初识FreeRTos

初识FreeRTos Preface一、FreeRTos简介二、 为什么选择FreeRTos三、FreeRTos资料和源码的下载四、介绍我自己的开发环境4.1FreeRTos4.2AlienTek Summary Preface 距离我上一次写博客已经差不多有5个月了&#xff0c;最近想给自己挖个新坑&#xff0c;讲一讲关于FreeRTos 相关的…

FreeRTOS移植

1. 前言 本文是基于FreeRTOSv9.0.0版本的实时系统&#xff0c;移植到STM32F103芯片平台上。移植环境使用的是MDK5.32版本&#xff0c;我在移植之前就已经构建好了一个裸机工程源码了&#xff0c;而且已经确保了这份裸机代码是没有问题的。开始移植之前我强烈建议一定要确认自己…

FreeRTOS快速入门-初探FreeRTOS

首发&#xff0c;公众号【一起学嵌入式】 对于 RTOS 入门系列文章&#xff0c;已经更新完一款&#xff08;RT-Thread&#xff09;&#xff1a; 助你快速入门 RT-Thread 这个系列的文章结合 RT-Thread&#xff0c;介绍过 RTOS 相关的核心知识。 接下来&#xff0c;开始另外一…

FreeRTOS系列|FreeRTOS简介

1. RTOS简介 RTOS全称为 Real Time Operation System&#xff0c;即实时操作系统。RTOS强调的是实时性&#xff0c;又分为硬实时和软实时。硬实时要求在规定的时间内必须完成操作&#xff0c;不允许超时&#xff1b;而软实时里对处理过程超时的要求则没有很严格。RTOS的核心就…

freertos任务基础知识(freertos篇)

多任务 对于单任务系统就是常说裸机大while循环&#xff0c;有的时候也需要加一些中断服务函数完成一些处理&#xff0c;相比于多任务而言上面的单任务系统也叫做前后台系统&#xff0c;即&#xff08;中断服务函数叫前台程序&#xff0c;大while叫后台程序&#xff09; 前后台…

FreeRTOS学习,适用于FreeRTOS初学者,FreeRTOS整体知识框架

目录 一、为什么要学习FreeRTOS 二、前言------从0到1认识FreeRTOS 1、逻辑系统与多任务系统 1.1、裸机系统&#xff1a;裸机系统通常分成轮询系统和前后台系统 1.2、多任务系统 2、数据结构-列表与列表项 三、任务 3.1基本属性 3.1.1任务栈 3.1.2任务控制块 3.1.3任…

一、初识FreeRTOS之FreeRTOS简介

目录 一、什么是FreeRTOS&#xff1f; 二、为什么选择FreeRTOS&#xff1f; 三、FreeRTOS的特点 四、FreeRTOS资料与源码下载 五、FreeRTOS源码文件介绍 一、什么是FreeRTOS&#xff1f; Free即免费的&#xff0c;RTOS的全称是Real time operating system,中文就是实时操作…