RTX临界段,中断锁与任务锁
os_resume
#include <rtl.h>
void os_resume (
U32 sleep_time ); /* Number of ticks the system was in sleep mode. */
说明:
返回值:
注意要点:
例程:
/* After Wake-up */
sleep = (tc - LPC_WWDT->TV) / 250;
}
os_resume(sleep);
os_suspend
#include <rtl.h>
U32 os_suspend (void);
说明:
返回值:
注意要点:
例程:
#include <rtl.h>
__task void os_idle_demon (void) {
uint32_t sleep;
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; /* Configure Cortex-M3 for deep sleep */
PWR->CR &= ~PWR_CR_PDDS; /* Enter Stop mode when in deepsleep */
PWR->CR |= PWR_CR_LPDS; /* Voltage regulator in low-power */
/* Enable LSI clock and wait until ready */
RCC->CSR |= RCC_CSR_LSION;
while ((RCC->CSR & RCC_CSR_LSIRDY) == 0);
/* Enable power interface clock */
RCC->APB1ENR |= RCC_APB1ENR_PWREN;
/* Disable backup domain write protection */
PWR->CR |= PWR_CR_DBP;
/* Select LSI as clock source for RTC and enable RTC */
RCC->BDCR &= ~RCC_BDCR_RTCSEL;
RCC->BDCR |= RCC_BDCR_RTCSEL_1;
RCC->BDCR |= RCC_BDCR_RTCEN;
/* Disable the write protection for RTC registers */
RTC->WPR = 0xCA;
RTC->WPR = 0x53;
/* Configure RTC auto-wakeup mode */
RTC->ISR &= ~RTC_ISR_WUTF; /* Clear wakeup timer flag */
RTC->CR &= ~RTC_CR_WUCKSEL; /* Set RTC clock to 2kHz */
RTC->CR |= RTC_CR_WUTIE; /* Enable RTC wakeup timer interrupt */
/* Configure EXTI line 22 for wakeup on rising edge */
EXTI->EMR |= (1 << 22); /* Event request is not masked */
EXTI->RTSR |= (1 << 22); /* Rising trigger enabled */
NVIC_EnableIRQ (RTC_WKUP_IRQn); /* Enable RTC WakeUp IRQ */
for (;;) {
/* HERE: include optional user code to be executed when no task runs. */
sleep = os_suspend (); /* OS Suspend */
if (sleep) {
RTC->ISR &= ~RTC_ISR_WUTF; /* Clear timer wakeup flag */
RTC->CR &= ~RTC_CR_WUTE; /* Disable wakeup timer */
while ((RTC->ISR & RTC_ISR_WUTWF) == 0);
/* RTC clock is @2kHz, set wakeup time for OS_TICK >= 1ms */
RTC->WUTR = (sleep * (OS_TICK / 1000) * 2);
RTC->CR |= RTC_CR_WUTE; /* Enable wakeup timer */
__WFE (); /* Enter STOP mode */
/* After Wake-up */
if ((RTC->ISR & RTC_ISR_WUTF) == 0) {
sleep = 0; /* We didn't enter Stop mode */
}
}
os_resume (sleep); /* OS Resume */
}
}
tsk_lock
#include <rtl.h>
void tsk_lock (void);
说明:
返回值:
注意要点:
例程:
#include <rtl.h>
void protect_critical_op () {
tsk_lock ();
do_critical_op ();
tsk_unlock ();
}
tsk_unlock
#include <rtl.h>
void tsk_unlock (void);
说明:
返回值:
注意要点:
例程:
#include <rtl.h>
void protect_critical_op () {
tsk_lock ();
do_critical_op ();
tsk_unlock ();
}
RTX临界段,中断锁与任务锁的更多相关文章
- Linux——临界段,信号量,互斥锁,自旋锁,原子操作
一. linux为什么需要临界段,信号量,互斥锁,自旋锁,原子操作? 1.1. linux内核后期版本是支持多核CPU以及抢占式调度.这里就存在一个并发,竞争状态(简称竟态). 1.2. 竞态条件 发 ...
- RTX——第11章 临界段,任务锁和中断锁
以下内容转载自安富莱电子: http://forum.armfly.com/forum.php 临界段代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断.为确保临界段代码的执行不被 ...
- FreeRTOS不允许在中断服务程序和临界段中执行不确定的性的操作
举例 等待事件标志组的任务,要是在中断服务程序中设置事件标志组,但不知道当前有多少个任务在等待此事件标志,这个操作即为不确定性操作,为了不在中断服务程序中执行此不确定性操作,只在中断服务程序中给一确定 ...
- FreeRTOS 调度锁,任务锁和中断锁
以下转载自安富莱电子: http://forum.armfly.com/forum.php 调度锁调度锁就是 RTOS 提供的调度器开关函数,如果某个任务调用了调度锁开关函数,处于调度锁开和调度锁关之 ...
- JAVA锁机制-可重入锁,可中断锁,公平锁,读写锁,自旋锁,
如果需要查看具体的synchronized和lock的实现原理,请参考:解决多线程安全问题-无非两个方法synchronized和lock 具体原理(百度) 在并发编程中,经常遇到多个线程访问同一个 ...
- FreeRTOS 临界段和开关中断
以下转载自安富莱电子: http://forum.armfly.com/forum.php 临界段代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断.为确保临界段代码的执行不被中断 ...
- FreeRTOS 中断配置和临界段
中断屏蔽寄存器 PRIMASK.FAULTMASK和BASEPRI 1.PRIMASK:这是个只有1个位的寄存器.当它置1时, 就关掉所有可屏蔽的异常,只剩下 NMI和硬fault可以响应.它的缺省值 ...
- 8.0-uC/OS-III临界段
1.临界段 (临界段代码,也叫临界区,是指那些必须完整连续运行,不可被打断的代码段) 锁调度器,可以执行ISR,开启调度器不可执行ISR: (1).临界段代码,也称作临界域,是一段不可分割的代码. u ...
- jvm高级特性(6)(线程的种类,调度,状态,安全程度,实现安全的方法,同步种类,锁优化,锁种类)
JVM高级特性与实践(十三):线程实现 与 Java线程调度 JVM高级特性与实践(十四):线程安全 与 锁优化 一. 线程的实现 线程其实是比进程更轻量级的调度执行单位. 线程的引入,可以把一个检查 ...
随机推荐
- PAT Basic 1006
1006 换个格式输出整数 (15 分) 让我们用字母 B 来表示“百”.字母 S 表示“十”,用 12...n 来表示不为零的个位数字 n(<10),换个格式来输出任一个不超过 3 位的正整数 ...
- CiscoIOUKeygen
python CiscoIOUKeygen.py | grep -A 1 ‘license’ > iourc
- sshd服务
SSHD服务 介绍:SSH 协议:安全外壳协议.为 Secure Shell 的缩写.SSH 为建立在应用层和传输层基础上的安全协议. 作用 sshd服务使用SSH协议可以用来进行远程控制, 或在计算 ...
- .Net转Java.06.字符串的split的区别
在Java遇到了将类似“1|2|3|4”的字符串分隔为数组的功能 这种问题能难倒有着十多年开发经验的的.NET码农? // Java代码 String s="1|2|3"; Str ...
- Error-MVC: 未能找到路径“D:\\DsWeb\DS.Web\dist\bin\roslyn\csc.exe”的一部分。
ylbtech-Error-MVC: 未能找到路径“D:\\DsWeb\DS.Web\dist\bin\roslyn\csc.exe”的一部分. 1.返回顶部 1, “/”应用程序中的服务器错误. 未 ...
- jQuery CVE-2019-11358原型污染漏洞分析和修复建议
一.安全通告 jQuery官方于日前发布安全预警通告,通报了漏洞编号为 CVE-2019-11358的原型污染漏洞.由攻击者控制的属性可被注入对象,之后或经由触发 JavaScript 异常引发拒绝服 ...
- Git远程仓库地址变更本地如何修改
以项目test为例: 老地址:http://192.168.1.1:9797/john/test.git 新地址:http://git.xxx.xxx/john/test.git 远程仓库名称: or ...
- [Canvas]空战游戏 已经可以玩了 1.13Playable
空战游戏做到这里,己方运动,己方发射子弹,敌方运动,敌方发射子弹,子弹与飞机碰撞,飞机与飞机碰撞都已经具备了,换言之已经可以玩了. 还需要一个奖励升级系统,在上面显示击落敌机数量等,还有己方不幸被击落 ...
- jvm理论-常量池-string
字符串常量池-常量项(cp_info)结构 CONSTANT_String_info{ u1 tag=8; u2 string_index;//存放 CONSTANT_Utf8_info 指针 } C ...
- CAS 单点登录【1】入门
1. CAS 的引入的前提和好处 很早期的公司,一家公司可能只有一个应用,慢慢的应用开始变多,如员工报销系统.审核系统.学习系统...... 每个应用都要进行注册登录,退出的时候又要一个个退出,用户操 ...