Цитата(aaarrr @ Feb 11 2012, 15:24)
И получите в коде холостую последовательность xSemaphoreGive() - xSemaphoreTake(). Красиво?
Я ничего не понял, столкнулся с той же проблемой что у автора, объясните поподробней плиз.
#include "stm32l1xx_gpio.h"
#include "stm32l1xx_rcc.h"
#include "stm32l1xx.h"
#include "stm32l1xx_exti.h"
#include "misc.h"
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"
#include "croutine.h"
xTaskHandle xp;
xTaskHandle xp1;
xSemaphoreHandle xBS;
xSemaphoreHandle xBS1;
static void prvLedBlink( void *pvParameters );
static void prvLedBlink2( void *pvParameters );
void vApplicationIdleHook( void ){}
void vApplicationMallocFailedHook( void ){ for( ;; );}
void vApplicationStackOverflowHook( xTaskHandle pxTask, signed char *pcTaskName )
{ ( void ) pcTaskName;
( void ) pxTask;
for( ;; );}
void vApplicationTickHook( void ){}
void RCC_Configuration(void)
{
SystemInit(); // Сброс по умолчанию
GPIO_DeInit(GPIOA);
GPIO_DeInit(GPIOB);
GPIO_DeInit(GPIOC);
GPIO_DeInit(GPIOD);
GPIO_DeInit(GPIOE);
RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB |
RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOD |
RCC_AHBPeriph_GPIOE, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOAEN, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIODEN, ENABLE);
}
void init_led()
{
GPIO_InitTypeDef PORT;
PORT.GPIO_Pin = (GPIO_Pin_7 | GPIO_Pin_6);
PORT.GPIO_Mode = GPIO_Mode_OUT;
PORT.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init( GPIOB , &PORT);
}
void init_but()
{
GPIO_InitTypeDef BUTA;
BUTA.GPIO_Pin = GPIO_Pin_0;
BUTA.GPIO_Mode = GPIO_Mode_IN;
BUTA.GPIO_Mode = GPIO_PuPd_NOPULL; // Хардварная кнопка и так подтянута
BUTA.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init( GPIOA , &BUTA);
GPIO_InitTypeDef BUTD;
BUTD.GPIO_Pin = GPIO_Pin_2;
BUTD.GPIO_Mode = GPIO_Mode_IN;
BUTD.GPIO_Mode = GPIO_PuPd_UP;
BUTD.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init( GPIOD , &BUTD);
}
void exiti()
{
__enable_irq ();
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
SYSCFG->EXTICR[0]|=SYSCFG_EXTICR1_EXTI0_PA; //линии конфирурируем
SYSCFG->EXTICR[0]|=SYSCFG_EXTICR1_EXTI2_PD;
EXTI->IMR|=EXTI_IMR_MR0; //разрешение прерывания всех Px0
EXTI->IMR|=EXTI_IMR_MR2; //разрешение прерывания всех Px2
EXTI->RTSR|=EXTI_RTSR_TR0; //фронт нарост
EXTI->RTSR|=EXTI_FTSR_TR2; //фронт спад
EXTI->RTSR|=EXTI_RTSR_TR2; //фронт нарост
EXTI->RTSR|=EXTI_FTSR_TR0; //фронт спад
NVIC_EnableIRQ (EXTI0_IRQn); // Разрешаем прерывания
NVIC_EnableIRQ (EXTI2_IRQn); // Разрешаем прерывания
NVIC_SetPriority(EXTI0_IRQn, 3);
NVIC_SetPriority(EXTI2_IRQn, 3);
}
void EXTI0_IRQHandler(void)
{
//GPIO_SetBits(GPIOB, GPIO_Pin_6);
EXTI->PR |= EXTI_PR_PR0;//сбросили бит прерывания
GPIO_SetBits(GPIOB, GPIO_Pin_7);
BaseType_t xHigherPriorityTaskWoken;
xHigherPriorityTaskWoken = pdFALSE;
xSemaphoreGiveFromISR(xBS, xHigherPriorityTaskWoken);
if( xHigherPriorityTaskWoken == pdFALSE )
{
portYIELD();
}
//taskYIELD();
}
void EXTI2_IRQHandler(void)
{
//GPIO_SetBits(GPIOB, GPIO_Pin_7);
portBASE_TYPE xHigherPriorityTaskWoken;
xHigherPriorityTaskWoken = pdFALSE;
xSemaphoreGiveFromISR(xBS, xHigherPriorityTaskWoken);
EXTI->PR |= EXTI_PR_PR2;//сбросили бит прерывания
taskYIELD();
}
void prvLedBlink( void *pvParameters )
{
while(1){
xSemaphoreTake( xBS, portMAX_DELAY );
GPIO_SetBits(GPIOB, GPIO_Pin_6);
taskYIELD();
}
}
void prvLedBlink2( void *pvParameters )
{
while(1){
xSemaphoreTake( xBS1, portMAX_DELAY );
GPIO_SetBits(GPIOB, GPIO_Pin_7);
taskYIELD();
}
}
int main(void)
{
RCC_Configuration();
init_led();
init_but();
exiti();
int i;
vSemaphoreCreateBinary(xBS);
vSemaphoreCreateBinary(xBS1);
if( xBS != NULL ) {
xTaskCreate(prvLedBlink,"LED",configMINIMAL_STACK_SIZE, NULL, 1, &xp);
}
if( xBS1!= NULL ){
xTaskCreate(prvLedBlink2,"LED2",configMINIMAL_STACK_SIZE, NULL, 1, &xp);
}
xTaskCreate(prvLedBlink2,"LED2",configMINIMAL_STACK_SIZE, NULL, 1, &xp1);
vTaskStartScheduler();
while(1)
{}
}