b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

freertos创建任务_freertos 任务_freertos任务切换(2)

电脑杂谈  发布时间:2017-02-21 01:11:40  来源:网络整理

上面提到, 创建系统所需任务和初始化相关静态变量后, 系统调用了 xPortStartScheduler设置节拍定时器和启动第一个任务,开始系统正常运行调度。 而对于不同架构平台,该函数的实现可能存在不同,以下, 拿比较常用的 Cotex-M3 架构举例。

对于 M3, 可以在源码目录下 看到该函数的实现。freertos 任务

与 FreeRTOS 任务优先级相反, Cotex-M3 优先级值越小, 优先级越高。 Cotex-M3的优先级配置寄存器考虑器件移植而向高位对齐,实际可用的 CPU 会裁掉表达优先级低端的有效位,以减少优先级数。 举例子说, 加入平台支持3bit 表示优先级,则其优先级配置寄存器的高三位可以编程写入,其他位被屏蔽,不管写入何值,重新读回都是0。

另外提供抢占优先级和子优先级分段配置相关,详细阅读 《Cortex-M3权威指南》

在系统调度过程中,主要涉及到的三个异常:

SVC 系统服务调用

操作系统通常不让用户程序直接访问硬件,而是通过提供一些系统服务函数。 这里主要触发后,在异常服务中启动第一个任务

PendSV 可悬起系统调用

相比 SVC, PenndSV 异常后可能不会马上响应, 等到其他高优先级中断处理后才响应。 用于上下文切换,同时保证其他中断可以被及时响应处理。

SysTick 节拍定时器

在没有高优先级任务强制下,同优先级任务按时间片轮流执行,每次SysTick中断,下一个任务将获得一个时间片。freertos 任务

BaseType_t xPortStartScheduler( void )
{
    configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY );
    #if( configASSERT_DEFINED == 1 )
    {
        volatile uint32_t ulOriginalPriority;
        // 取出中断优先级寄存器
        volatile uint8_t * const pucFirstUserPriorityRegister = 
            (volatile uint8_t * const) (portNVIC_IP_REGISTERS_OFFSET_16 +
                        portFIRST_USER_INTERRUPT_NUMBER);
        volatile uint8_t ucMaxPriorityValue;

        // 保存原有优先级寄存器值
        ulOriginalPriority = *pucFirstUserPriorityRegister;

        // 判断平台支持优先级位数
        // 先全写 1
        *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE;
        // 重新读回, 不能设置的位依然是 0
        ucMaxPriorityValue = *pucFirstUserPriorityRegister;
        // 确保用户设置优先级不会超出范围
        ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue;

        // 判断有几个1, 得到对应优先级数最大值
        ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS;
        while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE )
        {
            ulMaxPRIGROUPValue--;
            ucMaxPriorityValue <<= ( uint8_t ) 0x01;
        }
        ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;
        ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK;

        // 恢复优先级配置寄存器值
        *pucFirstUserPriorityRegister = ulOriginalPriority;
    }
    #endif /* conifgASSERT_DEFINED */

    // 设置 PendSV 和 SysTIck 异常优先级最低
    // 保证系统会话切换不会阻塞系统其他中断的响应
    portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI;
    portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI;

    // 初始化系统节拍定时器
    vPortSetupTimerInterrupt();
    // 初始化边界嵌套计数器
    uxCriticalNesting = 0;

    // 触发 svc 异常 启动第一个任务
    prvPortStartFirstTask();

    /* Should not get here! */
    prvTaskExitError();
    return 0;
}


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33581-2.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 武成帝
      武成帝

      中国遵守国际法则

    • 英武帝刘继元
      英武帝刘继元

      就是和韩国都没得比

    热点图片
    拼命载入中...