tag 标签: 优先级

相关博文
  • 热度 24
    2020-7-23 10:44
    2497 次阅读|
    0 个评论
    Cortex-M3/M4/M7有BASEPRI特殊功能寄存器可以屏蔽优先级低于BASEPRI设定值的中断,但Cortex-M0/M0+没有BASEPRI寄存器,不过仍然可以实现相识的功能。 mingdu.zheng at gmail dot com http://blog.csdn.net/zoomdy/article/details/79316998 实现方法 虽然Cortex-M0/M0+没有BASEPRI寄存器,但是仍然有NVIC,而且M0/M0+最多只有32个中断源,因此操作一个寄存器就可以影响所有中断源。假设使用了8个中断源,其中1、17中断优先级值为0x00(最高优先级),18、19中断优先级值为0x40,14、25中断优先级值为0x80,8、31中断优先级值为0xC0(最低优先级)。 中断号 优先级值 优先级 1 0x00 最高 17 0x00 最高 18 0x40 高 19 0x40 高 14 0x80 低 25 0x80 低 8 0xc0 最低 31 0xc0 最低 1、定义优先级分组宏 # define BASEPRI_0x40 ((1 << 1) | (1 << 17)) # define BASEPRI_0x80 (BASEPRI_0x40 | (1 << 18) | (1 << 19)) # define BASEPRI_0xc0 (BASEPRI_0x80 | (1 << 14) | (1 << 25)) # define BASEPRI_0x00 (BASEPRI_0xc0 | (1 << 8) | (1 << 31)) 2、定义中断使能控制宏 // 仅使能优先级值小于0x40的中断源(最高优先级中断源) // 相当于 BASEPRI = 0x40 #define SET_BASEPRI_40 ICER = 0xffffffff ISER = BASEPRI_0x40 // 使能优先级值小于0x80的中断源 / 相当于 BASEPRI = 0x80 #define SET_BASEPRI_80 ICER = 0xffffffff ISER = BASEPRI_0x80 // 使能优先级值小于0xc0的中断源 // 相当于 BASEPRI = 0xc0 #define SET_BASEPRI_C0 ICER = 0xffffffff ISER = BASEPRI_0xc0 / / 使能所有中断源 // 相当于 BASEPRI = 0x00 #define SET_BASEPRI_00 ICER = 0xffffffff ISER = BASEPRI_0xff 3、使用 // 这里只能使能最高优先级 SET_BASEPRI_40; ... // 现在可以使能全部中断了 SET_BASEPRI_00; ... // 就是这样用 4、优化 封装成和CMSIS-CORE API一样的实现,这样看起来就像真的在操作BASEPRI了。 static inline void __set_BASEPRI(uint32_t value) { if(value == 0) { SET_BASEPRI_00; } else if(value <= 0x40) { SET_BASEPRI_40; } else if(vlaue <= 0x80) { SET_BASEPRI_80; } else { SET_BASEPRI_c0; } } 缺陷 SVCall、PendSV和SysTick中断的使能不是NVIC_ISER控制的,因此这里的方法没有办法处理这三个中断。
  • 热度 18
    2015-7-31 17:05
    1510 次阅读|
    0 个评论
    SylixOS 支持 POSIX 编程标准,其优先级调度可以使用 POSIX 的函数直接设置,但测试发现在优先级调度上有稍许不同, SylixOS 下的优先级调度策略只支持 SCHED_RR 、 SCHED_FIFO 两种,不支持 SCHED_OTHER 。不过作为一个实时系统,如此设计也是理所当然。 在 SylixOS 优先级上需要注意, SylixOS 自身定义的 API 设置优先级时优先级设置值越小则该线程优先级越高。如果使用 POSIX 定义 API ,优先级设置值越大其优先级越高。在文件 k_priority.h 中说明了 SylixOS 中优先级设置使用注意事项,这里的优先级针对 SylixOS 自定义 API ,在 POSIX 下用户线程优先级设置范围为 5 ~ 205 。 /************************************************************************   优先级 (一般应用的最高优先级不能高于 LW_PRIO_CRITICAL 最低不能低过 LW_PRIO_LOW) ************************************************************************/ #define LW_PRIO_EXTREME    LW_PRIO_HIGHEST  /*  最高优先级            */ #define LW_PRIO_CRITICAL   50               /*  关键处理任           */ #define LW_PRIO_REALTIME   100              /*  实时处理任务         */ #define LW_PRIO_HIGH       150              /*  高优先级任务         */ #define LW_PRIO_NORMAL     200              /*  正常优先级           */ #define LW_PRIO_LOW        250              /*  低优先级             */ #define LW_PRIO_IDLE       LW_PRIO_LOWEST   /*  最低优先级           */ 为了对比 SylixOS 优先级调度的结果,设计 2 个线程分别验证: SCHED_FIFO 调度模式下,相同优先级的调度情况; SCHED_FIFO 调度模式下,不同优先级的调度情况; SCHED_RR 调度模式下,相同优先级的调度情况; SCHED_RR 调度模式下,不同优先级的调度情况; 使用默认设置创建线程,线程的调度情况。 在程序中创建两个线程,分别打印各自的信息,修改不同的调度方式和优先级,程序执行后会有不同的输出,读者根据代码中的提示查看修改即可。 #includestdio.h #includestdlib.h #includepthread.h #includesched.h #includeunistd.h #includesys/time.h #includesys/resource.h #includestring.h void *fun_thread(void *arg) {    int                id = (int)arg;    int                i,j;    int                policy;    int                priority;    struct sched_param param;    printf("thread %d start\n", id);    sleep(id + id);    pthread_getschedparam(pthread_self(), policy, param);    /* 分析线程的调度策略     * SylixOS中SCHED_RR与SCHED_OTHER的定义相同     */    if (policy == SCHED_RR) {        priority = param.sched_priority;        printf("thread %d SCHED_RR=%d \n", id, priority);    }    if (policy == SCHED_FIFO) {        priority = param.sched_priority;        printf("thread %d SCHED_FIFO=%d \n", id, priority);    }    for (i = 1; i 10; i++) {       for(j = 1; j 100000000; j++) {       }       printf("this is thread %d\n", id);    }    printf("Thread %d exit\n", id);    return (NULL); } int main(int argc, char *argv[]) {    int id = 0;    int i = getuid();    /*  获取当前进程用户名  */    if (i == 0) {       printf("The current user is root\n");    } else {       printf("The current user is not root\n");    }    pthread_t           tid1,tid2;    pthread_attr_t      attr1,attr2;    struct sched_param  param1;    struct sched_param  param2;    param1.sched_priority = 98;    param2.sched_priority = 99;    pthread_attr_init(attr1);    /*  使用默认设置初始化线程属性  */    pthread_attr_init(attr2);    /* PTHREAD_EXPLICIT_SCHED 新创建线程使用设置属性,     * PTHREAD_INHERIT_SCHED  新创建线程继承主线程属性     */    pthread_attr_setinheritsched(attr1, PTHREAD_EXPLICIT_SCHED);    pthread_attr_setinheritsched(attr2, PTHREAD_EXPLICIT_SCHED);    /*     * 设置线程调度策略     * SCHED_FIFO  若无更高优先级任务打断,该任务运行直至结束     * SCHED_RR    相同优先级任务会平衡调度,各个任务都能得到执行     * param1      设置线程优先级,     */    pthread_attr_setschedpolicy(attr1, SCHED_FIFO);    pthread_attr_setschedparam(attr1, param1);    pthread_attr_setschedpolicy(attr2, SCHED_FIFO);    pthread_attr_setschedparam(attr2, param2);    sleep(1);    /*     *  创建线程,并设置优先级,     *  若将 attr1/2 使用 NULL 替换,标识线程使用默认设置创建     */    id++;    pthread_create(tid1, attr1, fun_thread, (void *)id);    id++;    pthread_create(tid2, attr2, fun_thread, (void *)id);    pthread_join(tid1, NULL);    pthread_join(tid2, NULL);    pthread_attr_destroy(attr1);    pthread_attr_destroy(attr2);    return (0); } 需要注意的是,由于线程中使用 for 循环模拟线程任务,当使用 release 版本编译时,会将此部分代码进行优化,从而影响实验效果。
相关资源
  • 所需E币: 2
    时间: 2023-3-20 18:53
    大小: 213.38KB
    上传者: 张红川
    单片机外中断的扩展及其多优先级软件实现方法.pdf
  • 所需E币: 5
    时间: 2023-2-11 17:31
    大小: 1.01MB
    上传者: ZHUANG
    基于节点优先级服务的混合P2P网络性能分析
  • 所需E币: 2
    时间: 2022-12-16 00:29
    大小: 139.04KB
    上传者: fzyiye
    STM32中断优先级与相关使用概念
  • 所需E币: 0
    时间: 2022-5-3 16:18
    大小: 130.1KB
    上传者: ZHUANG
    多优先级业务分组交换网的阻塞性能分析算法
  • 所需E币: 1
    时间: 2022-1-7 17:09
    大小: 139.04KB
    上传者: 西风瘦马
    STM32中断优先级与相关使用
  • 所需E币: 0
    时间: 2022-1-8 09:32
    大小: 322.8KB
    上传者: ZHUANG
    嵌入式系统设计中的部件优先级分配算法
  • 所需E币: 1
    时间: 2022-1-8 10:43
    大小: 969.58KB
    上传者: 西风瘦马
    raw-os实例之——互斥锁(优先级置顶方式)
  • 所需E币: 0
    时间: 2021-3-17 16:58
    大小: 5.56MB
    上传者: Argent
    arm公司设计的内核在电子产品MCU中仍占据主流,其设计的armcortex内核有多个系列,根据产品设计需求选择相应的类型,而Cortex-M系列是面向具有确定性的微控制器应用的成本敏感型解决方案,分享关于Cortex-M3的综合性讲解资料,欢迎下载阅读。
  • 所需E币: 1
    时间: 2020-11-19 17:10
    大小: 914.95KB
    上传者: zendy_731593397
    STM32的通信中断优先级
  • 所需E币: 0
    时间: 2020-8-28 15:07
    大小: 547.85KB
    上传者: 指的是在下
    一种基于动态优先级的NBIoT随机接入算法
  • 所需E币: 3
    时间: 2019-12-25 21:02
    大小: 523.84KB
    上传者: 978461154_qq
    uC/OS-II源码公开的嵌入式实时多任务操作系统内核……
  • 所需E币: 4
    时间: 2019-12-25 12:41
    大小: 15.03KB
    上传者: wsu_w_hotmail.com
    利用实时核的软件设计--pSOS软件设计……
  • 所需E币: 5
    时间: 2019-12-25 12:16
    大小: 217KB
    上传者: quw431979_163.com
    任务管理第4章任务管理14.0建立任务,OSTaskCreate()24.1建立任务,OSTaskCreateExt()64.2任务堆栈94.3堆栈检验,OSTaskStkChk()114.4删除任务,OSTaskDel()144.5请求删除任务,OSTaskDelReq()174.6改变任务的优先级,OSTaskChangePrio()204.7挂起任务,OSTaskSuspend()234.8恢复任务,OSTaskResume()254.9获得有关任务的信息,OSTaskQuery()26任务管理在前面的章节中,笔者曾说过任务可以是一个无限的循环,也可以是在一次执行完毕后被删除掉。这里要注意的是,任务代码并不是被真正的删除了,而只是µC/OS-Ⅱ不再理会该任务代码,所以该任务代码不会再运行。任务看起来与任何C函数一样,具有一个返回类型和一个参数,只是它从不返回。任务的返回类型必须被定义成void型。在本章中所提到的函数可以在OS_TASK文件中找到。如前所述,任务必须是以下两种结构之一:|voidYourTask(void*pdata)||{||for(;;){||/*用户代码*/……
  • 所需E币: 3
    时间: 2019-12-25 12:16
    大小: 572KB
    上传者: wsu_w_hotmail.com
    实时系统概念第2章实时系统概念12.0前后台系统(Foreground/BackgroundSystem)12.1代码的临界段22.2资源22.3共享资源22.4多任务22.5任务22.6任务切换(ContextSwitchorTaskSwitch)32.7内核(Kernel)32.8调度(Scheduler)42.9不可剥夺型内核(Non-PreemptiveKernel)42.10可剥夺型内核52.11可重入性(Reentrancy)52.12时间片轮番调度法72.13任务优先级72.142.14静态优先级72.15动态优先级72.16优先级反转72.17任务优先级分配82.18互斥条件102.18.1关中断和开中断102.18.2测试并置位112.18.3禁止,然后允许任务切换112.18.4信号量(Semaphores)122.19死锁(或抱死)(Deadlock(orDeadlyEmbrace))162.20同步162.21事件标志(EventFlags)182.22任务间的通讯(IntertaskCommunication)182.23消息邮箱(MessageMailboxes)182.24消息队列(MessageQueue)192.25中断202.26中断延迟202.27中断响应212.28……
  • 所需E币: 3
    时间: 2019-12-25 10:33
    大小: 10.27MB
    上传者: 二不过三
    嵌入式操作系统原理……