1、基本任务切换

举报
内核笔记 发表于 2021/06/09 01:25:20 2021/06/09
【摘要】 轮询模式: int main () { for (;;) { flag = 0; delay(100); flag = 1; delay(100); } return 0; } 1234567891011 加入中断: #define NVIC_INT_CTRL 0xE000ED04 // 中断控制及状态寄存器 #define NVIC_PENDSVSET...

轮询模式:

int main () 
{ for (;;) { flag = 0; delay(100); flag = 1; delay(100); }

return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

加入中断:

#define NVIC_INT_CTRL   0xE000ED04  // 中断控制及状态寄存器
#define NVIC_PENDSVSET  0x10000000  // 触发软件中断的值
#define NVIC_SYSPRI20xE000ED22  // 系统优先级寄存器
#define NVIC_PENDSV_PRI 0x000000FF  // 配置优先级

#define MEM32(addr) *(volatile unsigned long *)(addr)
#define MEM8(addr)  *(volatile unsigned char *)(addr)


void triggerPendSVC (void) 
{
MEM8(NVIC_SYSPRI2) = NVIC_PENDSV_PRI;   // 向NVIC_SYSPRI2写NVIC_PENDSV_PRI,设置其为最低优先级
MEM32(NVIC_INT_CTRL) = NVIC_PENDSVSET;// 向NVIC_INT_CTRL写NVIC_PENDSVSET,用于PendSV
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

软件中断

CPU寄存器数据的保护(压栈)与恢复(出栈)

__asm void PendSV_Handler ()
{
IMPORT  blockPtr

// 加载寄存器存储地址
LDR R0, =blockPtr
LDR R0, [R0]
LDR R0, [R0]

// 保存寄存器
STMDB   R0!, {R4-R
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

文章来源: xuesong.blog.csdn.net,作者:内核笔记,版权归原作者所有,如需转载,请联系作者。

原文链接:xuesong.blog.csdn.net/article/details/79256750

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。