freertos的任务调度器的启动函数分析(根据源码使用)

news2024/11/25 2:39:56

volatile uint8_t * const pucFirstUserPriorityRegister = ( uint8_t * ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER );

通过宏pucFirstUserPriorityRegister=0xE000E400(根据宏名字,这是NVIC寄存器地址)

查手册知到

中断优先级设置寄存器的第一个寄存器。

ulOriginalPriority = *pucFirstUserPriorityRegister;保存第一个寄存器的值

获取寄存器有效位。

ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue;

#define configMAX_SYSCALL_INTERRUPT_PRIORITY   \

 ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

configMAX_SYSCALL_INTERRUPT_PRIORITY=(5<<(8-4))

ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS;//为7

   while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE )

        {//portTOP_BIT_OF_BYTE=0x80

        /*有几个有效位,就执行几次*/

            ulMaxPRIGROUPValue--;//最后的值为7-4

            ucMaxPriorityValue <<= ( uint8_t ) 0x01;

        }

        /* Shift the priority group value back to its position within the AIRCR

        register. *///注释表明,将得到的值填入AIRCR寄存器,来确定如何分组。

        ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;//3左移8位

        ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK;//仅保留3左移8位后的位为1

这里3左移8位,然后填入PRIGROUP;

    /* Make PendSV and SysTick the lowest priority interrupts. */因为用4位表示优先级,所以这里是15。

    portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI;

    portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI;

    void vPortSetupTimerInterrupt( void )

{

        /* Configure SysTick to interrupt at the requested rate. *///产生指定周期的中断

        portNVIC_SYSTICK_LOAD_REG =

( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;

        portNVIC_SYSTICK_CTRL_REG =

( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT );

}

__asm void prvStartFirstTask( void )

{

    PRESERVE8

    /* Use the NVIC offset register to locate the stack. */

    ldr r0, =0xE000ED08

    ldr r0, [r0]

    ldr r0, [r0]

    /* Set the msp back to the start of the stack. */

    msr msp, r0

    /* Globally enable interrupts. */

    cpsie i

    cpsie f

    dsb

    isb

    /* Call SVC to start the first task. */

    svc 0

    nop

    nop

}

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

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

相关文章

26523-2022 精制硫酸钴 随笔练习

声明 本文是学习GB-T 26523-2022 精制硫酸钴. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了精制硫酸钴的要求、试验方法、检验规则、标志、标签、包装、运输和贮存。 本文件适用于精制硫酸钴。 注&#xff1a;该产品主要用于…

【面试题】有了Docker为啥还需要k8s?

个人主页&#xff1a;金鳞踏雨 个人简介&#xff1a;大家好&#xff0c;我是金鳞&#xff0c;一个初出茅庐的Java小白 目前状况&#xff1a;22届普通本科毕业生&#xff0c;几经波折了&#xff0c;现在任职于一家国内大型知名日化公司&#xff0c;从事Java开发工作 我的博客&am…

【python】基础语法

文章目录 元组列表字典集合推导式函数错误和异常处理文件和操作系统 元组 元组是一个固定长度&#xff0c;不可改变的Python序列对象。创建元组的最简单方式&#xff0c;是用逗号分隔一列值。 创建 2. 元组不可修改的解释 对于元组对象不可变的说明&#xff0c;通俗一点就是…

自学成为一名黑客

前言&#xff1a;想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安…

【操作系统】调度算法的评价指标和三种调度算法

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 操作系统 一、调度算法的评价指标1.1 CPU利…

使用cpolar端口映射的方法轻松实现在Linux环境下SVN服务器的搭建与公网访问

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

深入剖析ThreadLocal使用场景、实现原理、设计思想

前言 ThreadLocal可以用来存储线程的本地数据&#xff0c;做到线程数据的隔离 ThreadLocal的使用不当可能会导致内存泄漏&#xff0c;排查内存泄漏的问题&#xff0c;不仅需要熟悉JVM、利用好各种分析工具还耗费人工 如果能明白其原理并正确使用&#xff0c;就不会导致各种意…

【Verilog 教程】6.2Verilog任务

关键词&#xff1a;任务 任务与函数的区别 和函数一样&#xff0c;任务&#xff08;task&#xff09;可以用来描述共同的代码段&#xff0c;并在模块内任意位置被调用&#xff0c;让代码更加的直观易读。函数一般用于组合逻辑的各种转换和计算&#xff0c;而任务更像一个过程&a…

win10搭建Selenium环境+java+IDEA(2)

接着上一个搭建环境开始叙述&#xff1a;win10系统x64安装java环境以及搭建自动化测试环境_荟K的博客-CSDN博客 上一步结尾的浏览器驱动&#xff0c;本人后面改到了谷歌浏览器.exe文件夹下&#xff1a; 这里需要注意&#xff0c;这个新路径要加载到系统环境变量中。 上一步下…

2023-9-28 JZ26 树的子结构

题目链接&#xff1a;树的子结构 import java.util.*; /** public class TreeNode {int val 0;TreeNode left null;TreeNode right null;public TreeNode(int val) {this.val val;}} */ public class Solution {public boolean HasSubtree(TreeNode root1,TreeNode root2) …

吉利微型纯电,5 万元的快乐

熊猫骑士作为一款主打下层市场的迷你车型&#xff0c;吉利熊猫骑士剑指宝骏悦也&#xff0c;五菱宏光 MINI 等热门选手。 9 月 15 日&#xff0c;吉利熊猫骑士正式上市&#xff0c;售价为 5.39 万&#xff0c;限时优享价 4 .99 万元。价格和配置上对这个级别定位的战略车型有一…

力扣刷题-哈希表-判断两个字符串_其他中元素是否一致

242 有效的字母异位词 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s “anagram”, t “nagaram” 输出: true 示例 2: 输入: s “rat”, t “car” 输出: false 说明: 你可以假设字符串只包含小写字母。 解释&#x…

云安全之身份认证与授权机制介绍

认证与授权技术概述 认证&#xff0c;用于证实某事是否真实或有效的过程。认证一般由标识(ldentification)和鉴别(Authentication)两部分组成。 认证技术分类 身份认证&#xff1a;口令认证、生物特征识别 报文认证&#xff1a;报文源的认证、报文宿的认证、报文内容的认证…

网络爬虫--伪装浏览器

从用户请求的Headers反反爬 在访问某些网站的时候&#xff0c;网站通常会用判断访问是否带有头文件来鉴别该访问是否为爬虫&#xff0c;用来作为反爬取的一种策略。很多网站都会对Headers的User-Agent进行检测&#xff0c;还有一部分网站会对Referer进行检测&#xff08;一些资…

MQ - 34 基础功能:在消息队列内核中支持WebSocket的设计

文章目录 导图概述WebSocket 是什么双工(双向)通信特点和应用场景客户端使用示例WebSocket 协议和消息队列内核中支持 WebSocket 协议支持功能生产消费协议设计支持 WebSocket Server主动消息推送RabbitMQ / Pulsar 如何支持 WebSocket 协议总结导图

Java基础面试题精选:深入探讨哈希表、链表和接口等

目录 1.ArrayList和LinkedList有什么区别&#xff1f;&#x1f512; 2.ArrayList和Vector有什么区别&#xff1f;&#x1f512; 3.抽象类和普通类有什么区别&#xff1f;&#x1f512; 4.抽象类和接口有什么区别&#xff1f;&#x1f512; 5.HashMap和Hashtable有什么区别&…

百数服务商——顶杰云,为建筑行业数字化转型“添砖加瓦”

杭州顶杰科技有限公司&#xff1a; 顶杰科技是国内一家行业领先的软件与信息技术服务提供商同时也是百数在建筑业的垂直领域服务商&#xff0c;通过低代码、云计算、AI大数据、IOT、区块链等先进的产品和技术&#xff0c;致力服务于政府、运营商、央国企、制造、金融、教育、能…

AI项目十:Swin Transformer目标检测环境搭建

若该文为原创文章&#xff0c;转载请注明原文出处。 Swin Transformer是做什么的这里不做介绍&#xff0c;主要是记录下学习的全过程&#xff0c;Swin Transformer在搭建和训练的过程中&#xff0c;折腾了很久&#xff0c;主要是在折腾环境。 一、AutoDL租用实例 个人没有GP…

多线程的学习中篇下

volatile 关键字 volatile 能保证内存可见性 volatile 修饰的变量, 能够保证 “内存可见性” 示例代码: 运行结果: 当输入1(1是非O)的时候,但是t1这个线程并沿有结束循环, 同时可以看到,t2这个线程已经执行完了,而t1线程还在继续循环. 这个情况,就叫做内存可见性问题 ~~ 这…

初识Java 11-2 函数式编程

目录 高阶函数 闭包 函数组合 柯里化和部分求值 本笔记参考自&#xff1a; 《On Java 中文版》 高阶函数 ||| 高阶函数的定义&#xff1a;一个能接受函数作为参数或能把函数当返回值的函数。 把函数当返回值的情况&#xff1a; import java.util.function.Function;inter…