介绍:
freertos临界区还能进行系统调度吗
freertos临界区不能能进行系统调度。
临界区指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段,而这些共用资源又无法同时被多个线程访问的特性;当有线程进入临界区时,其他线程或是进程必须等待。总的概括来说就是在执行该程序片段区间,不允许其他东西干扰到。
像我们在 MCU上面跑实时操作系统,一般都是单核单进程的,而一个进程可以拥有多个线程;FreeRTOS是主要以抢占式任务调度为主(通过 PendSV中断),以时间片轮转调度任务为辅(通过 SysTick系统节拍器中断)的实时操作系统,并且可支持同等优先级切换,具体配置可以看 FreeRTOS篇章之 FreeRTOSConfig.h分析;而刚讲的线程其实就相当于我们用 xTaskCreate函数创建的各种任务。在这里,我们要实现临界区操作,那么就相当于要保证当前所处在的需要保护的代码片段不要受其他任务(线程)的干扰(例如同等优先级的切换、中断的触发)。
freertos vxworks系统的优点和缺点
1、FreeRTOS是一个迷你的实时操作系统内核。最大的特点是“小”,占用资源小,支持8位、16位、32位MCU平台。FreeRTOS提供了操作系统基本的功能和组件,包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等。此外FreeRTOS还有一个最大的优势就是就是免费。不足之处,一方面体现在系统的服务功能上,如FreeRTOS只提供了消息队列和信号量的实现,无法以后进先出的顺序向消息队列发送消息;另一方面,FreeRTOS只是一个操作系统内核,需外扩第三方的GUI(图形用户界面)、TCP/IP协议栈、FS(文件系统)等才能实现一个较复杂的系统,不像μC/OS-II可以和μC/GUI、μC/FS、μC/TCP-IP等无缝结合。
2、VxWorks不仅是一种嵌入式实时操作系统,又是可以运行的最小基本程序。其内部有BSP(BoardSupportPackage,板级支持包),便于进行驱动程序的编写。此外,VxWorks具有强实时性、微内核设计、可裁剪性、可移植性和可靠性等特点,能较好地满足嵌入式开发的需求。缺点就是昂贵的价格让开发者望而却步。
FreeRTOS操作系统例程:任务栈溢出检测
* 1. 学习FreeRTOS的任务栈溢出检测方法一(模拟栈溢出)。
* 2. FreeRTOS的任务栈溢出检测方法一说明:
* a. FreeRTOSConfig.h文件中配置宏定义:
* #define configCHECK_FOR_STACK_OVERFLOW 1
* b. 在任务切换时检测任务栈指针是否过界了,如果过界了,在任务切换的时候会触发栈溢出钩子函数。
* void vApplicationStackOverflowHook( TaskHandle_t xTask,
* signed char *pcTaskName );
* 用户可以在钩子函数里面做一些处理。本实验是在钩子函数中打印出现栈溢出的任务。
* c. 这种方法不能保证所有的栈溢出都能检测到。比如任务在执行的过程中发送过栈溢出。任务切换前
* 栈指针又恢复到了正常水平,这种情况在任务切换的时候是检测不到的。又比如任务栈溢出后,把
* 这部分栈区的数据修改了,这部分栈区的数据不重要或者暂时没有用到还好,如果是重要数据被修
* 改将直接导致系统进入硬件异常。这种情况下,栈溢出检测功能也是检测不到的。
* d. 本实验就是简单的在任务vTaskUserIF中申请过大的栈空间,模拟出一种栈溢出的情况,溢出后触
* 发钩子函数,因为我们将溢出部分的数据修改了,进而造成进入硬件异常。
#define configCHECK_FOR_STACK_OVERFLOW 1
/*
*********************************************************************************************************
* 函 数 名: StackOverflowTest
* 功能说明: 任务栈溢出测试
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
static void StackOverflowTest(void)
{
int16_t i;
uint8_t buf[2048];
(void)buf; /* 防止警告 */
/*
1. 为了能够模拟任务栈溢出,并触发任务栈溢出函数,这里强烈建议使用数组的时候逆着赋值。
因为对于M3和M4内核的MCU,堆栈生长方向是向下生长的满栈。即高地址是buf[2047], 低地址
是buf[0]。如果任务栈溢出了,也是从高地址buf[2047]到buf[0]的某个地址开始溢出。
因此,如果用户直接修改的是buf[0]开始的数据且这些溢出部分的数据比较重要,会直接导致
进入到硬件异常。
2. 栈溢出检测是在任务切换的时候执行的,我们这里加个延迟函数,防止修改了重要的数据导致直接
进入硬件异常。
3. 任务vTaskTaskUserIF的栈空间大小是2048字节,在此任务的入口已经申请了栈空间大小
------uint8_t ucKeyCode;
------uint8_t pcWriteBuffer[500];
这里再申请如下这么大的栈空间
-------int16_t i;
-------uint8_t buf[2048];
必定溢出。
*/
for(i = 2047; i = 0; i--)
{
buf[i] = 0x55;
vTaskDelay(1);
}
}
/*
*********************************************************************************************************
* 函 数 名: vApplicationStackOverflowHook
* 功能说明: 栈溢出的钩子函数
* 形 参: xTask 任务句柄
* pcTaskName 任务名
* 返 回 值: 无
*********************************************************************************************************
*/
void vApplicationStackOverflowHook( TaskHandle_t xTask, signed char *pcTaskName )
{
printf("任务:%s 发现栈溢出\r\n", pcTaskName);
}
实验目的:
* 1. 学习FreeRTOS的任务栈溢出检测方法二(模拟栈溢出)。
* 2. FreeRTOS的任务栈溢出检测方法二说明:
* a. FreeRTOSConfig.h文件中配置宏定义:
* #define configCHECK_FOR_STACK_OVERFLOW 2
* b. 在任务切换时检测任务栈指针是否过界了,如果过界了,在任务切换的时候会触发栈溢出钩子函数。
* void vApplicationStackOverflowHook( TaskHandle_t xTask,
* signed char *pcTaskName );
* 用户可以在钩子函数里面做一些处理。本实验是在钩子函数中打印出现栈溢出的任务。
* c. 任务创建的时候将任务栈所有数据初始化为0xa5,任务切换时进行任务栈检测的时候检测末尾
* 的16个字节是否都是0xa5,通过这种方式来检测任务栈是否溢出了。相比方法一,这种方法的速度
* 稍慢些,但是这样就有效的避免了方法一里面的部分情况。不过依然不能保证所有的栈溢出都能检测
* 到,比如任务栈末尾的16个字节没有用到,即没有被修改,但是任务栈已经溢出了,这种情况是检
* 测不到的。另外任务栈溢出后,任务栈末尾的16个字节没有修改,但是溢出部分的栈区的数据修改
* 了,这部分栈区的数据不重要或者暂时没有用到还好,如果是重要数据被修改将直接导致系统进入硬
* 件异常。这种情况下,栈溢出检测功能也是检测不到的。
* d. 本实验就是简单的在任务vTaskUserIF中申请过大的栈空间,模拟出一种栈溢出的情况,溢出后触
* 发钩子函数,因为我们将溢出部分的数据修改了,进而造成进入硬件异常。
#define configCHECK_FOR_STACK_OVERFLOW 2
函数内容和上面一样:
static void StackOverflowTest(void)
void vApplicationStackOverflowHook( TaskHandle_t xTask, signed char *pcTaskName )
freertos时实系统的栈最大是多少
系统栈和任务栈。
系统栈:
裸机情况下,凡是用到栈的地方都是用的Stack_Size EQU 0x00000400
而到了FreeRTOS下,这个系统栈主要是手动入栈的寄存器,中断服务程序里面的局部变量,中断嵌入要用到。
任务栈:
就是 configTOTAL_HEAP_SIZE 定义的大小。
网友评论
最新评论
i; -------uint8_t buf[2048]; 必定溢出。 */ for(i = 2047; i = 0; i--) { buf[i] = 0x55; v
序。其内部有BSP(BoardSupportPackage,板级支持包),便于进行驱动程序的编写。此外,VxWorks具有强实时性、微内核设计、可裁剪性、可移植性和可靠性等特点,能较好
。这种情况下,栈溢出检测功能也是检测不到的。 * d. 本实验就是简单的在任务vTaskUserIF中申请过大的栈空间,模拟出一种栈溢出的情况,溢出后触 * 发钩子函数,因为我们将
理、记录功能、软件定时器、协程等。此外FreeRTOS还有一个最大的优势就是就是免费。不足之处,一方面体现在系统的服务功能上,如FreeRTOS只提供了消息队列和信号量的实现,无法以后进先出的顺序向消息队列发送消息;另一
介绍:1、freertos临界区还能进行系统调度吗2、freertos vxworks系统的优点和缺点3、FreeRTOS操作系统例程:任务栈溢出检测4、freertos时实系统的栈最大是多少freertos临界区还能进行系统调度吗freertos临界区不能能进行系统调度。临界区