金牌会员
- 积分
- 1280
- 金钱
- 1280
- 注册时间
- 2010-12-14
- 在线时间
- 0 小时
|
发表于 2011-4-13 22:43:41
|
显示全部楼层
OS_cpu_a.asm文件中:
OS_ENTER_CRITICAL
CPSID I ; Disable all the interrupts
PUSH {R1,R2}
LDR R1, =OSInterrputSum ; OSInterrputSum++
LDRB R2, [R1]
ADD R2, R2, #1
STRB R2, [R1]
POP {R1,R2}
BX LR
;/***************************************************************************************
;* 函数名称: OS_EXIT_CRITICAL
;*
;* 功能描述: 退出临界区
;*
;* 参 数: None
;*
;* 返 回 值: None
;*****************************************************************************************/
OS_EXIT_CRITICAL
PUSH {R1, R2}
LDR R1, =OSInterrputSum ; OSInterrputSum--
LDRB R2, [R1]
SUB R2, R2, #1
STRB R2, [R1]
MOV R1, #0
CMP R2, #0 ; if OSInterrputSum=0,enable
; interrupts如果OSInterrputSum=0,
MSREQ PRIMASK, R1
POP {R1, R2}
BX LR
--------------------------------------
我的理解是硬中断+软中断,
我写过一段测试代码测试OS_ENTER_CRITICAL(),OS_EXIT_CRITICAL();
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "includes.h"
//Mini STM32开发板扩展实例 8
//ucos 实验
//正点原子@ALIENTEK
//2010.12.25
//设置任务堆栈大小
#define LED_STK_SIZE 64
#define LED1_STK_SIZE 64
#define START_STK_SIZE 128
#define USART_STK_SIZE 64
//设置任务优先级
#define LED_TASK_Prio 5
#define LED1_TASK_Prio 9
#define USART_TASK_Prio 8
#define START_TASK_Prio 10 //这个任务的优先级应该是最高的
//任务堆栈
OS_STK TASK_LED1_STK[LED_STK_SIZE];
OS_STK TASK_LED_STK[LED_STK_SIZE];
OS_STK TASK_START_STK[START_STK_SIZE];
OS_STK TASK_USART_STK[USART_STK_SIZE];
//任务申明
void TaskStart(void *pdata);
void TaskLed(void *pdata);
void TaskLed1(void *pdata);
void TaskUsart(void *pdata);
//系统时钟配置函数
void SysTick_Configuration(void);
INT32U time1=0;
INT32U time2=0;
//Mini STM32开发板ucos范例
//基于ucos2.52内核.
//张洋@ALIENTEK
//www.openedv.com
//2010.12.15
/**
* OS_ENTER_CRITICAL(),OS_EXIT_CRITICAL()之间的代码段构成临界段,此段代码不能被中断打断,
*也就是说,在执行此段代码的过程中不进行任务调度,那么期间即使有高优先级的任务等待时间到达,那么也不能立即获得cpu的控制权
**/
void _delay(INT32U times){
while(times--);
}
int main(void)
{ INT8U state;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口初始化为9600
LED_Init(); //初始化与LED连接的硬件接口
SysTick_Configuration();
OSInit();
state=OSTaskCreate( TaskStart, //task pointer
(void *)0, //parameter
(OS_STK *)&TASK_START_STK[START_STK_SIZE-1], //task stack top pointer
START_TASK_Prio ); //task priority
if(state==OS_PRIO_EXIST){}
OSStart(); //开始调度
return 0;
}
//开始任务
void TaskStart(void * pdata)
{
pdata = pdata; //防止某些编译器报错
OS_ENTER_CRITICAL();
OSTaskCreate(TaskLed, (void *)0, &TASK_LED_STK[LED_STK_SIZE-1], LED_TASK_Prio);
OSTaskCreate(TaskLed1, (void *)0, &TASK_LED1_STK[LED1_STK_SIZE-1], LED1_TASK_Prio);
// OSTaskCreate(TaskUsart,(void *)0, &TASK_USART_STK[USART_STK_SIZE-1],USART_TASK_Prio);
OSTaskSuspend(START_TASK_Prio); //suspend but not delete
OS_EXIT_CRITICAL();
}
//任务1
//控制DS0的亮灭.
void TaskLed(void *pdata)
{
while(1)
{
LED0=!LED0;
printf("TaskLED0...LED0=%d\n",LED0);
OSTimeDlyHMSM(0,0,0,100);//500ms
}
}
//任务2
//控制DS1的亮灭.
void TaskLed1(void *pdata)
{
while(1)
{
LED1=!LED1;
printf("TaskLED1...LED1=%d\n",LED1);
OS_ENTER_CRITICAL();
printf("enter Critical...\n");
_delay(1000000);
printf("exit Critical...\n");
OS_EXIT_CRITICAL();
printf("enter Active...\n");
_delay(1000000);
printf("exist Active...\n");
OSTimeDlyHMSM(0,0,0,200);//500ms
}
}
|
|