一、信号

RTX支持每个线程多达16个信号标志。这些信号存储在线程控制块中。可以暂停一个线程的执行,直到系统中另一个线程设置了特定的信号标志或一组信号标志。

osEvent osSignalWait ( int32_t signals,uint32_t millisec);

值为0xFFFF时,定义一个无限超时时间。

如果在调用osSignalWait时将signals变量设置为零,那么设置任何标志都会导致线程继续执行。你可以通过读取oseven .value.signals的返回值来查看设置了哪个标志。

任何线程都可以在任何其他线程上设置或清除信号。

int32_t osSignalSet ( osThreadId thread_id, int32_t signals);
int32_t osSignalClear ( osThreadId thread_id, int32_t signals);

线程同步例程main:

/*----------------------------------------------------------------------------Designers Guide to the Cortex-M FamilyCMSIS RTOS Signal Example*----------------------------------------------------------------------------*/
#include "stm32f10x.h"
#include <cmsis_os.h>
#include "Board_LED.h"void led_Thread1 (void const *argument);
void led_Thread2 (void const *argument);osThreadDef(led_Thread1, osPriorityNormal, 1, 0);
osThreadDef(led_Thread2, osPriorityNormal, 1, 0);osThreadId T_led_ID1;
osThreadId T_led_ID2;void delay (void)
{
unsigned int index;
const unsigned int count = 1000000;for(index =0;index<count;index++){;}
}
/*----------------------------------------------------------------------------Flash LED 1 when signaled by the led_Thread2*---------------------------------------------------------------------------*/
void led_Thread1 (void const *argument)
{for (;;) {osSignalWait (0x00,osWaitForever);LED_On(1);                          osSignalWait (0x00,osWaitForever); LED_Off(1);}
}
/*----------------------------------------------------------------------------Flash LED two and synchronise the flashing of LED 1 by setting a signal flag*---------------------------------------------------------------------------*/
void led_Thread2 (void const *argument)
{for (;;) {LED_On(2);       osSignalSet (T_led_ID1,0x01);delay();LED_Off(2);osSignalSet (T_led_ID1,0x02);delay();}
}/*----------------------------------------------------------------------------Start the threads*---------------------------------------------------------------------------*/
int main (void)
{osKernelInitialize ();                    // initialize CMSIS-RTOSLED_Initialize();T_led_ID2 = osThreadCreate(osThread(led_Thread2), NULL);T_led_ID1 = osThreadCreate(osThread(led_Thread1), NULL);  osKernelStart ();                         // start thread execution
}

中断

在RTOS应用程序中,最好将中断服务代码设计为RTOS中的一个线程,并为其分配一个高优先级。中断线程的第一行代码应该让它等待一个信号标志。当中断发生时,ISR简单地设置信号标志并终止。这将调度为中断服务的中断线程,然后返回等待下一个信号标志被设置。

例程:

void Thread3 (void)
{
while(1)
{
osSignalWait ( isrSignal,waitForever); // Wait for the ISR to trigger an event
….. // Handle the interrupt
} // Loop round and go back sleep
}
The actual interrupt source will contain a minimal amount of code.
void IRQ_Handler (void)
{
osSignalSet (tsk3,isrSignal); // Signal Thread 3 with an event
}

ADC中断例程:

#include "stm32f10x.h"
#include "cmsis_os.h"#include "Board_LED.h"void led_Thread1 (void const *argument);
void led_Thread2 (void const *argument);
void adc_Thread  (void const *argument);
void init_ADC (void);                       osThreadDef(led_Thread1, osPriorityNormal, 1, 0);
osThreadDef(led_Thread2, osPriorityNormal, 1, 0);
osThreadDef(adc_Thread, osPriorityAboveNormal, 1, 0);osThreadId T_led_ID1;
osThreadId T_led_ID2;
osThreadId T_adc_ID;/*----------------------------------------------------------------------------ADC interrupt handler. On Conversion set ADC thread signal*---------------------------------------------------------------------------*/
void ADC1_2_IRQHandler (void)
{osSignalSet(T_adc_ID,0x01);ADC1->SR &= ~(1 << 1);
}void adc_Thread (void const *argument)
{for (;;) { osSignalWait(0x01,osWaitForever);   GPIOB->ODR = ADC1->DR;}
}void led_Thread1 (void const *argument)
{for (;;){osSignalWait(0x01,osWaitForever);LED_On(1);                          osSignalWait(0x01,osWaitForever);    LED_Off(1);}
}void led_Thread2 (void const *argument)
{for (;;) {LED_On(2);       osSignalSet(T_led_ID1,0x01);osDelay(500);ADC1->CR2 |=  (1UL << 22);               //Start ADC conversionLED_Off(2);osSignalSet(T_led_ID1,0x01);osDelay(500);}
}/*----------------------------------------------------------------------------Initilise the ADC and create the threads*---------------------------------------------------------------------------*/
int main (void) {LED_Initialize();init_ADC();       T_led_ID1 = osThreadCreate(osThread(led_Thread1), NULL);T_led_ID2 = osThreadCreate(osThread(led_Thread2), NULL);T_adc_ID = osThreadCreate(osThread(adc_Thread), NULL);   for (;;);
}/*----------------------------------------------------------------------------ADC initilisation code defined as a SVC function. Must be in priviliged mode to enable the NVIC interrupt*---------------------------------------------------------------------------*/
void init_ADC(void){RCC->APB2ENR |= ( 1UL <<  2);           /* enable periperal clock for GPIOA */GPIOA->CRL &= ~0x000000F0;              /* set PIN1 as analog input         *//* Setup and initialize ADC converter                                       */RCC->CFGR |= ( 3UL << 14);            /* ADC clk = PCLK2 / 8              */RCC->APB2ENR |= ( 1UL <<  9);           /* enable periperal clock for ADC1  */ADC1->SQR1 = 0;                      /* Regular chn. Sequence length = 1 */ADC1->SQR2 = 0;                      /* Clear register                   */ADC1->SQR3 = (1UL << 0);                /* 1. conversion = channel 1        */ADC1->SMPR2 = (5UL << 3);              /* sample time channel 1  55,5 cyc. */ADC1->CR1 = (1UL << 8);                 /* Scan mode on                     */ADC1->CR2 = (7UL << 17)|                /* select SWSTART                   */(1UL << 20) ;               /* enable external Trigger          */ADC1->CR1 |= (1UL << 5);                /* enable for EOC Interrupt         */NVIC->ISER[0] = (1UL << 18);            /* To Access the NVIC we must be in priviliged mode    */}

当我们添加了一个线程时,我们还需要增加并发运行线程的数量。

RTX操作系统教程[02]相关推荐

  1. 【RTX操作系统教程】第6章 RTX操作系统源码方式移植

    原文来源:http://forum.armfly.com/forum.php?mod=viewthread&tid=16616&highlight=RTX%B2%D9%D7%F7%CF ...

  2. 【RTX操作系统教程】第3章 初学RTX操作系统准备工作

    转载来源:http://forum.armfly.com/forum.php?mod=viewthread&tid=16521&highlight=RTX%B2%D9%D7%F7%CF ...

  3. arm rtx教程_【RTX操作系统教程】第5篇 RTX操作系统库方式移植(超级简单).pdf

    武汉安富莱电子有限公司 武汉安富莱电子有限公司 WWW.ARMFLY.COM 安富莱STM32-V4开发板RTX教程 WWW.ARMFLY.COM 安富莱STM32-V4开发板RTX教程 第5章 RT ...

  4. arm rtx教程_【RTX操作系统教程】第4章 RTX操作系统介绍

    第4章 RTX操作系统介绍 本章节介绍一下RTX操作系统,让大家对RTX有一个整体的了解,Keil RTX 是免版税的确定性实时操作系统,适用于 ARM 和 Cortex-M 设备. 4.1 RTX系 ...

  5. 【RTX操作系统教程】第4章 RTX操作系统介绍

    原文来源:http://forum.armfly.com/forum.php?mod=viewthread&tid=16553&highlight=RTX%B2%D9%D7%F7%CF ...

  6. RTX操作系统教程[00]

    官方教程地址: RTX官方教程 (下文摘自官方教程) 一.概述 该RTOS本身由一个支持循环.抢占和协作的程序线程多任务调度程序组成.以及时间和内存管理服务.其他RTOS对象支持线程间通信,包括信号触 ...

  7. 第6章 RTX 操作系统源码方式移植

    以下内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章教程为大家将介绍 RTX 操作系统源码方式移植,移植工作比较简单,只需要用户添加需要的源码文件即可, ...

  8. 【Zigbee技术入门教程-02】一图读懂ZStack协议栈的核心思想与工作机理

    [Zigbee技术入门教程-02]一图读懂ZStack协议栈的核心思想与工作机理 广东职业技术学院  欧浩源   Z-Stack协议栈是一个基于任务轮询方式的操作系统,其任务调度和资源分配由操作系统抽 ...

  9. VAPS XT开发入门教程02:安装配置

    开工第一步是安装软件 windows下 windows下有安装手册,但是此安装手册在安装包里面,只有在安装完成后才能看到.没有安装手册又无法安装. 先准备安装文件和授权证书. License_Tool ...

最新文章

  1. TypeError: the JSON object must be str, bytes or bytearray, not dict
  2. (chap1 网络基础知识)网络的构成要素:(4-6)集线器和3层交换机
  3. 第一章 基础算法 【完结】
  4. delphi中採用bpl共享模塊的幾點釋疑
  5. java model.put_深入理解Java内存模型(一)——基础
  6. 前端学习(679):switch语句
  7. 【php】使用phpdbg来调试php程序
  8. FastDFS存储服务器部署
  9. 实例构造函数与静态构造函数执行顺序
  10. weblogic安装部署升级小结
  11. swagger注解的使用
  12. Android小白快速编写APP登录界面
  13. 漫画:用木兰从军说外观模式
  14. 【路由器】OpenWrt 简介和安装
  15. java做一个人类类属性_java.编写一个包含姓名,身高属性的Person类,
  16. SXSSFWorkbook 表格内换行
  17. 【02】水果蔬菜识别系统-基于tensorflow2.3开发
  18. Activity销毁不调用Ondestroy情况以及处理
  19. WEB服务器的基本介绍
  20. 互联网日报 | 2月1日 星期一 | 苏宁宣布云网万店组织架构;威马汽车完成上市辅导;美团上线医疗健康品牌“百寿健康网”...

热门文章

  1. 论文阅读笔记:Global-Locally Self-Attentive Dialogue State Tracker
  2. 手机QQ,登陆不上去
  3. pandas ix与iloc
  4. 2015年,写下“世界那么大,我想去看看”的女教师,终被现实打败
  5. 关于苹果开发证书失效的解决方案(2016年2月14日Failed to locate or generate matching signing assets)
  6. hht时频谱 matlab 乱序_【原创】用希尔伯特黄变换(HHT)求时频谱和边际谱
  7. 蛙跳差分格式(非恒定流)
  8. 计算机网络搭建比赛申请书,C世界计算机社团成立申请书
  9. Unity Package manifest
  10. 砥砺前行20载,他见证了中国制造信息化的成长