首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

韦东山freeRTOS系列教程之【第十二章】资源管理(Resource Management)

文章目录 系列教程总目录 概述 12.1 屏蔽中断 12.1.1 在任务屏蔽中断 12.1.2 ISR屏蔽中断 12.2 暂停调度器 概述 在前面讲解互斥量时,引入过临界资源的概念。...我禁止调度器,运行任务切换 .. toctree:: :maxdepth: 2 section1 12.1 屏蔽中断 屏蔽中断有两套宏:任务中使用、ISR中使用: 任务中使用:taskENTER_CRITICA...在任务屏蔽中断的示例代码如下: /* 在任务,当前时刻中断使能的 * 执行这句代码后,屏蔽中断 */ taskENTER_CRITICAL(); /* 访问临界资源 */ /* 重新使中断...ISR屏蔽中断 要使用含有"FROM_ISR"后缀的宏,示例代码如下: void vAnInterruptServiceRoutine( void ) { /* 用来记录当前中断是否使能 */...UBaseType_t uxSavedInterruptStatus; /* ISR,当前时刻中断可能是使能的,也可能是禁止的 * 所以要记录当前状态, 后面要恢复为原先的状态

59640

C语言可重入函数和不可重入函数

如何写出可重入的函数?函数体内访问那些全局变量,不使用静态局部变量,坚持使用缺省态(auto)局部变量,写出的函数就将是可重入的。如果 必须访问全局变量,记住利用互斥信号量来保护全局变量。...下 面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。...有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许ISR做浮点运 算。此外,ISR应该是短而有效率的,ISR做浮点运算是不明智的。...就是说,你可以在这个函数执行的任何时候中断他的运行OS的 调度下去执行另外一段代码不会出现什么错误。...函数体内访问那些全局变量,不使用静态局部变量,坚持使用局部变量,写出的函数就将是可重入的。如果必须访问全局 变量,记住利用互斥信号量来保护全局变量。

3.4K30
您找到你想要的搜索结果了吗?
是的
没有找到

FreeRTOS例程2-任务挂起恢复与使用中断遇到的坑!

实验中用到了按键作为中断,本想用vTaskDelay(10)进行消抖,结果是程序运行起来后,按下中断的按键,程序卡死,通过调试运行,发现程序死了这里: //port.c的429~443行 void vPortEnterCritical...推而广之,其它不带FromISR后缀的API函数也不能在中断函数中使用! 另外,中断函数本来就是为了处理紧急情况,中断函数延时是不太合理的。 中断函数必须使用带FromISR后缀的API函数!...如果应用程序使用CMSIS库进行中断配置,那么启动调度程序之前,通过调用NVIC_SetPriorityGrouping(0); 可以在所有Cortex-M设备上实现正确的设置。...如果应用程序使用CMSIS库进行中断配置,那么启动调度程序之前,通过调用NVIC_SetPriorityGrouping(0);可以在所有Cortex-M设备上实现正确的设置。...这两段意思是在说优先级分组的事,即所有位都是抢占优先级,没有次优先级,即中断分组模式4,也就是函数设置的: NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4

2.6K30

中断程序要注意哪些方面?

有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许ISR做浮点运算。此外,ISR应该是短而有效率的,ISR做浮点运算是不明智的。...如果中断发生的时候,当运行到printf的时候,假设发生了中断嵌套,此时stdout资源被占用,所以第二个中断printf等待第一个中断的stdout资源释放,第一个中断等待第二个中断返回,造成了死锁...就是说,你可以在这个函数执行的任何时候中断他的运行OS的调度下去执行另外一段代码不会出现什么错误。...不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等等,所以他如果被中断的话,可能出现问题,所以这类函数是不能运行在多任务环境下的。...函数体内访问那些全局变量,不使用静态局部变量,坚持使用局部变量,写出的函数就将是可重入的。如果必须访问全局变量,记住利用互斥信号量来保护全局变量。

2.9K30

嵌入式实时操作系统UCOSII

UCOS操作系统的程序结构 裸机:有且只能有一个函数,并且函数必须要有死循环(while(1)),把要实现的功能在函数里实现。...上了UCOSII操作系统后:有且只能有一个函数,函数可以不需要死循环(while(1)),工程中有多个任务,每个任务都必须有个死循环,把要实现的功能写进各个任务。...任务状态:休眠/停止、等待/挂起、就绪、运行中断 UCOS操作系统的系统调度和任务切换 系统调度:当发生系统调度的时候,系统就会查询当前所有处于就绪状态的任务的优先级,把CPU的使用权给到优先级最高的那个任务...—变化 中断服务函数里的第一个行,必须加入“OSIntEnter()”,表示当前操作系统进入了中断服务函数 中断服务函数里的最后一行,必须加入“OSIntExit()”,表示当前操作系统要退出中断服务函数...中断使能---系统滴答中断NVIC是必须响应,不需要再使能 //NVIC_EnableIRQ(SysTick_IRQn); SysTick->CTRL |=0x01<<1; SysTick->

3.3K20

FPGA 之 SOPC 系列(五)Nios II 软件使用与程序开发 I

基本调试功能包括:运行控制、调用堆栈查看、软件断点、反汇编代码查看、调试信息查看、指令集仿真器。 高级调试功能包括:硬件断点调试ROM或闪存代码、数据触发、指令跟踪。 ?...该标志符会被填入SYSTEM ID寄存器,供编译器和用户辨别所运行的程序是否与目标系统匹配。当程序运行在与之匹配的系统上会出现错误。...5.9 中断机制和软件调试 + 中断定义: 特定的事件(中断源,也称中断请求信号)触发下引起CPU暂停正在运行的程序(主程序),转而先去处理一段为特定事件编写的处理程序(中断处理程序),等中断处理程序处理完成后...所有的专项处理程序都是由用户定义然后注册到中断向量表的,叫做用户ISR。系统ISR的入口地址是SOPC_Builder定义的,叫Exception Address。...这里面有一个需要注册的地方,如果handler不是NULL,则该优先级中断注册成功后将自动使能,也即是说,只要我们handler处有相应的ISR,我们就不需要再进行使能处理了。

83820

中断的一点思考

8259A收到CPU的INTA信号后,将优先级最高的那个中断请求ISR寄存器(In-Service Register,简称ISR对应的bit置1,表示该中断请求已得到CPU的服务,同时IRR寄存器的相应位被清零重置...否则,ISR寄存器的相应位就一直保持为1,直到8259A显示地收到来自于CPU的EOI命令。 打住,各位看官读到这里,能回答如下问题吗? 1.    执行中断处理程序时,中断一直是关闭着的吗?...细心的读者可能还有一个问题,为什么handle_IRQ_event()返回时,还要关闭本地所有的中断(即代码的local_irq_disable();)。...《源代码情景分析》一书中p216第10行提到:“这样,就把本来可能发生在同一通道(甚至可能来自同一中断源)的中断嵌套化解为一个循环”。本人认为这种嵌套仅仅针对的是SMP的情况。...我曾经一个培训资料上看到如下的结论: 实时应用中断的发生不但要求迅速的中断服务,还要求迅速的调度有关的进程进入运行,在用户空间中对事件处理。

1.3K20

TT无人机扩展模块库分析(default.ino)补篇1

很多时候, 我们的代码是需要跨系统平台编译和运行的. 比如: 一个小功能代码, 需要既可以Win下面运行, 还要可以Max, linux上面运行....当前正在处理的事情优先去执行中断服务程序。...注意 ISR中断服务程序)函数,delay()函数是工作的,而且millis()函数返回值也不再增长。ISR中断服务程序)运行期间Arduino开发板接收到的串口数据也可能丢失。...millis()函数的运行依赖Arduino开发板的中断功能,因此ISR函数的millis()函数是无法正常运行的。...一般情况下,ISR函数与主程序之间传递数据是依靠全局变量来实现的。为了确保全局变量ISR函数可以正常的工作,应该将可能被ISR函数中使用的全局变量声明为volatile类型。

1.1K20

STM32 看门狗详解

若要修改寄存器,必须首先对 IWDG_KR寄存器写入代码 0x5555。写入其他值则会破坏该序列,从而使寄存器访问保护再次生效。这意味着重装载操作(即写入 0xAAAA)也会启动写保护功能。...通过设置 WWDG_CFR 寄存器的 EWI 位使能 EWI 中断。当递减计数器的值为0x40 时,将生成 EWI 中断。...复位器件之前,可以使用相应的中断服务程序 (ISR) 来触发特定操作(例如通信或数据记录)。...某些应用,可以使用 EWI 中断来管理软件系统检查和/或系统恢复/功能退化,不会生成 WWDG 复位。...通过将 0 写入 WWDG_SR 寄存器的 EWIF 位来清除 EWI 中断 2.4 如何设置看门狗超时 例子:APB1的频率是24MHZ,WDGTB[1:0]设置3,T[5:0]设置成63 t =

78910

FreeRTOS学习笔记 | 基础知识体系梳理

RTOS下,上面截图里设置的栈大小有了一个新名字叫做系统栈空间,任务栈是不使用这里的空间,哪里使用这里的栈空间呢,实际上是中断函数和中断嵌套。... FreeRTOS 操作系统堆栈指针 MSP 是给系统栈空间使用的,进 程堆栈指针 PSP 是给任务栈使用的。...又比如,如果中断服务程序使一个高优先级的任务进入就绪态,中断完成时,被中断的低优先级任务被挂起,优先级高的那个任务开始运行。...默认情况下,此宏定义已经 FreeRTOS.h 文件里面使能了,用户可以不用在FreeRTOSConfig.h 文件再单独使能。...为确保临界区代码的执行不被中断进入临界区之前须关中断临界区代码执行完毕后,要立即开中断

88610

如何将回调和中断服务函数进行结合?

可以是以动态的形式分配回调,也可以以静态的形式分配回调,静态分配的回调的好处是不能在运行时进行更改,但动态分配对于执行期间可能需要更改中断行为的应用程序非常有用。...这种方式允许开发人员获取回调函数并将其分配给他们需要的中断,以便将其分配给这样的UART接收或传输中断串口驱动程序,我们代码的时候可能定义了几个不同的中断。...RxDataBuffer, aRxBuffer[0]); HAL_UART_Receive_IT(&huart2, (uint8_t *)aRxBuffer, 1); } 系统初始化代码然后进行以下调用以将函数分配给中断服务处理程序执行的函数指针...: Uart_Hal_CallbackRegister(Uart1_ISR, UserIsrFunction); 拥有一个可以被调用以更改中断执行的函数的API可能看起来很危险,也可能是一个安全漏洞...,但我们的想法是使驱动程序代码保持不变,甚至可以作为预编译库提供。

86420

韦东山freeRTOS系列教程之【第十一章】中断管理(Interrupt Management)

11.3 中断与任务间的通信 概述 RTOS,需要应对各类事件。...FreeRTOS使用两套函数,不是使用一套函数,是因为有如下好处: 使用同一套函数的话,需要增加额外的判断代码、增加额外的分支,是的函数更长、更复杂、难以测试 在任务、ISR调用时,需要的参数不一样...ISR调用API时不进行任务切换,只是"xHigherPriorityTaskWoken"中标记一下,除了效率,还有多种好处: 效率高:避免不必要的任务切换 让ISR更可控:中断随机产生,API...中进行任务切换的话,可能导致问题更复杂 可移植性 Tick中断,调用vApplicationTickHook():它运行ISR,只能使用"FromISR"的函数 使用"FromISR"函数时,如果不想使用...t3:创建任务时设置任务2的优先级比任务1高(这取决于设计者),所以ISR返回后,运行的是任务2,它要完成中断的处理。

1.9K71

ARM(十三).WatchDog1

正确设定内存(只读栈和读写栈,也就是代码区与数据区的大小) 选择H-JTAG ARM 模式 选择正确的模式 使用外部工具 代码示例 wtd.s 这是汇编程序,定义了中断向量表,进行了各种初始化...,本源文件可能引用该符号,main定义c源文件 AREA RESET, CODE, READONLY ;定义一个名为RESET的只读代码段 CODE32 ;CODE32伪指令指示汇编编译器后面的指令为...代表禁止所有中断,使用ARM模式,进入中断模式) LDR SP, =IRQStack_BASE ;IRQStack_BASE另一个文件定义,将中断模式的堆栈指针SP指到IRQStack_BASE...,这可用于异常处理返回,使用'^'后缀进行数据传送且寄存器列表包含PC时,加载/存储的是用户模式的寄存器,不是当前模式的寄存器 ENDP END main.c c 程序定义了处理逻辑...rWTCNT = 50625; //喂狗,如果喂狗,超时就会复位 这一句,再次运行 一小会儿后蜂鸣器就会停响, LED 灯也会熄灭

74840

Linux中断机制:硬件处理,初始化和中断处理

5、 CPU可以处理下一个中断的时候,从IRR中选取最高优先级的中断,清0 IRR的对应位,并设置ISR的对应位,然后ISR中最高优先级的中断被发送到CPU执行(如果其它优先级和屏蔽检查通过)。...2、ISA irqs,对这些中断初始化过程已经完成了irq_desc、vector_irq、以及IDT对应entry的分配和设置,同时可以发现ISA中断初始化的时候都被设置为运行在0号CPU...) interrupt是一个数组,该数组初始化完成后释放,其每个数组项都是一个地址,是对应的“pushq_cfi”代码的地址(每个代表中断入口的标号)。...系统初始化的时候,对外设使用interrupt数组作中断处理接口,就是中断发生时,执行代码段: ?...,其一个cpu核心上建立vector,对应的MSI-X中断事实上被绑定到该cpu核心上。

7.8K30

纯干货|最经典的STM32概述!

款式M:用于深度嵌入的,单片机风格的系统 介绍A:用于高性能的“开放应用平台”,应用在那些需要运行复杂应用程序的处理器。...堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程) 进程堆栈指针(PSP):由用户的应用程序代码使用。... CM3 运行应用程序时(线程模式),既可以使用特权级,也可以使用用户级;但是异常服务例程必须在特权级下执行。复位后,处理器默认进入线程模式,特权极访问。...向量中断支持: 当开始响应一个中断后,CM3会自动定位一张向量表,并且根据中断号从表找出 ISR的入口地址,然后跳转过去执行。...这简化了软件开发和代码维护,使产品面市更快。 Thumb-2指令集为编程带来了更多的灵活性。

95120

侃侃单片机的裸奔程序的框架

; 读书时代的我会把键盘扫描用查询的方式放在循环中,串口接收数据用中断中断服务函数组成相应的帧格式后置位相应的标志位,函数的循环中进行数据的处理,串口发送数据以及led的显示也放在循环中...; 这样整个程序就以标志变量的通信方式,相互配合的循环和后台中断执行;然而必须指出其不妥之处: 每个任务的时间片可能过长,这将导致程序的实时性能差。...这样虽然导致整个系统其它任务不能运行,但也很大程度上,削弱了系统的实时性能,因为它用了延时函数; 我们用两种有效的方法来解决此问题: 第一,在按键功能比较简单的情况下,我们仍然用上面的kbscan()...在这个过程我们不能用软件延时,更不能用死循环等待等方式;所以我们串口接收中断函数,只是把数据放置于一个缓冲队列。...至于组成帧,以及检查帧的工作我们循环中解决,并且每次循环中我们处理一个数据,每个字节数据的处理间隔的弹性比较大,因为我们已经缓存在了队列里面。

1.2K22

【STM32F429】第6章 ThreadX操作系统移植(IAR)

虽然本章节是以我们开发板为例进行移植的,但是教会大家如何移植到自己的板子上以及移植过程的注意事项是本章节的重点。...默认是定时任务里面,当定义了下面函数后,将直接在定时器中断里面处理,可以去掉定时器任务所消耗资源。...,劣势是增加代码量 */ //#define TX_INLINE_THREAD_RESUME_SUSPEND /* 设置TreadX内核不可中断,好处是降低处理负担,并且产生的代码小。...替换HAL的函数。因为HAL的缺省函数依赖于Systick中断,如果在USB、SD * 卡中断中有延迟函数,则会锁死。...C里面对应的使能: 汇编里面对应的使能: 6.4 第2步:添加ThreadX库所有相关文件到裸机工程模板 了解了ThreadX内核框架后,介绍下如何将移植到裸机工程模板里面。

63120

【STM32F429】第5章 ThreadX操作系统移植(MDK AC6)

虽然本章节是以我们开发板为例进行移植的,但是教会大家如何移植到自己的板子上以及移植过程的注意事项是本章节的重点。...默认是定时任务里面,当定义了下面函数后,将直接在定时器中断里面处理,可以去掉定时器任务所消耗资源。...,劣势是增加代码量 */ //#define TX_INLINE_THREAD_RESUME_SUSPEND /* 设置TreadX内核不可中断,好处是降低处理负担,并且产生的代码小。...替换HAL的函数。因为HAL的缺省函数依赖于Systick中断,如果在USB、SD * 卡中断中有延迟函数,则会锁死。...C里面对应的使能: 汇编里面对应的使能: 5.4 第2步:添加ThreadX库所有相关文件到裸机工程模板 了解了ThreadX内核框架后,介绍下如何将移植到裸机工程模板里面。

81820

【STM32F429】第4章 ThreadX操作系统移植(MDK AC5)

虽然本章节是以我们开发板为例进行移植的,但是教会大家如何移植到自己的板子上以及移植过程的注意事项是本章节的重点。...默认是定时任务里面,当定义了下面函数后,将直接在定时器中断里面处理,可以去掉定时器任务所消耗资源。...替换HAL的函数。因为HAL的缺省函数依赖于Systick中断,如果在USB、SD * 卡中断中有延迟函数,则会锁死。...C里面对应的使能: 汇编里面对应的使能: 4.4 第2步:添加ThreadX库所有相关文件到裸机工程模板 了解了ThreadX内核框架后,介绍下如何将移植到裸机工程模板里面。...所以他们打算接管xxxx.S启动文件,但接管的文件仅写了几个重要的中断向量表入口。这就给让移植的人非常不方便。所以我们做的例子接管XXX.S启动文件了,方便大家移植。

44420
领券