Перейти к содержанию
    

Antonov

Участник
  • Постов

    10
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. mutex - есть ли очередь?

    Здравствуйте. Сначала описание проблемы (ну или того что у меня просто не получается по незнанию) - есть две задачи, каждая из них может обращаться к разделяемому ресурсу, для поочередного доступа я использую mutex (на самом деле я просто изучаю FreeRTOS и пробую различные тесты для этого). Написал такой код: void Task_1( void *pvParametrs ) { while(1) { xSemaphoreTake( mutex_1, portMAX_DELAY ); LCD_ClearLine(LCD_LINE_6); LCD_ClearLine(LCD_LINE_7); LCD_DisplayStringLine(LCD_LINE_6, (uint8_t *)" TASK 1 "); vTaskDelay( 2000 / portTICK_RATE_MS ); xSemaphoreGive( mutex_1 ); } } void Task_2( void *pvParametrs ) { while(1) { xSemaphoreTake( mutex_1, portMAX_DELAY ); LCD_ClearLine(LCD_LINE_6); LCD_ClearLine(LCD_LINE_7); LCD_DisplayStringLine(LCD_LINE_7, (uint8_t *)" TASK 2 "); vTaskDelay( 3000 / portTICK_RATE_MS ); xSemaphoreGive( mutex_1 ); } } Задача 1 и 2 имеют одинаковые приоритеты. Так вот код в задаче 2, который находится за попыткой схватить семафор, никогда не выполняется. В 3х других RTOS с которыми я имел дело (TNKernel, CHibiOS, SMX) - такой-же код (ну со своим API естественно) работает нормально - то есть поочередно выполняется код task_1 и task_2 (задача стоит просто проверить работу mutex, поэтому не надо предлагать других методов выполнения этой простой задачи). Видимо в тех RTOS есть "очередь" на mutex - и если задача попыталась схватить, занятый mutex, то она встает в эту очередь и после освобождения mutex другой задачей первая его хватает. А в FreeRTOS такого получается нету? Или я что то не правильно делаю? P.S. если после xSemaphoreGive первую задачу отправить в сон (Delay) - то всторая задача все-же захватывает mutex и выполняет свой код и выполянется 2 задача постоянно - 1 уже не может схватить mutex (ну если 2 задачу в сон после xSemaphoreGive не отправлять тоже) - что вроде говорит что mutex работают, но без очереди. Во внутренности очень не охото лезть - может уже кто сталкивался с таким. Заранее благодарю за любые подсказки.
  2. С __write вроде разобрался, а как с помощью std::streambuf - может у вас есть небольшой примерчик?
  3. Здравствуйте. Может кто знает, а как правильно пользоваться iostream и сout в IAR? Если более точно, надо перенаправить вывод в отладочную консоль IAR (terminal I/O). Нужно использовать именно cout << (код чужой и его много). Может, кончено, вопрос совсем глупый, но в C++ я не очень, так что извиняюсь если что. Забыл - компилятор под ARM, если это имеет значение. Заранее благодарю за все советы.
  4. STM32L, RTC OUT alarm - PC13

    Нашел в reference manual: The selection of the RTC AFO_ALARM output is performed through the RTC_TAFCR register as follows: ALARMOUTTYPE is used to select whether the RTC AFO_ALARM output is configured in push-pull or open-drain mode. ALARMOUTTYPE: RTC_ALARM output type 0: ALARM_AF0 is an open-drain output 1: ALARM_AF0 is a push-pull output В библиотеке от ST - RTC_OutputTypeConfig(RTC_OutputType_PushPull); Так теперь работает: RTC_AlarmCmd(RTC_Alarm_A, DISABLE); EXTI_ClearITPendingBit(EXTI_Line17); EXTI_InitStructure.EXTI_Line = EXTI_Line17; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = RTC_Alarm_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // time independent date RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_DateWeekDay; RTC_AlarmStructure.RTC_AlarmTime.RTC_H12 = RTC_HourFormat_24; RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours = 15; RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes = 0; RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds = 5; RTC_AlarmStructure.RTC_AlarmDateWeekDay = 1; RTC_AlarmStructure.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_WeekDay; RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &RTC_AlarmStructure); //RTC_AlarmSubSecondConfig(RTC_Alarm_A, 0xFF, RTC_AlarmSubSecondMask_SS14_5); RTC_OutputConfig(RTC_Output_AlarmA, RTC_OutputPolarity_High); RTC_OutputTypeConfig(RTC_OutputType_PushPull); /* Enable AlarmA interrupt */ RTC_ITConfig(RTC_IT_ALRA, ENABLE); RTC_AlarmCmd(RTC_Alarm_A, ENABLE); RTC_ClearITPendingBit(RTC_IT_ALRA);
  5. STM32L, RTC OUT alarm - PC13

    Здравствуйте. Может, кто-нибудь пробовал выводить сигнал об RTC alarm на порт. Как я понял, он должен выводится на PC13 (МК stm32L), но у меня не получается. Привожу свой код. void RTC_alarm_config(void) { EXTI_InitTypeDef EXTI_InitStructure; RTC_AlarmTypeDef RTC_AlarmStructure; NVIC_InitTypeDef NVIC_InitStructure; RTC_AlarmCmd(RTC_Alarm_A, DISABLE); EXTI_ClearITPendingBit(EXTI_Line17); EXTI_InitStructure.EXTI_Line = EXTI_Line17; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = RTC_Alarm_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // time independent date RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_DateWeekDay; RTC_AlarmStructure.RTC_AlarmTime.RTC_H12 = RTC_HourFormat_24; RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours = 15; RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes = 0; RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds = 5; RTC_AlarmStructure.RTC_AlarmDateWeekDay = 1; RTC_AlarmStructure.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_WeekDay; RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &RTC_AlarmStructure); //RTC_AlarmSubSecondConfig(RTC_Alarm_A, 0xFF, RTC_AlarmSubSecondMask_SS14_5); RTC_OutputConfig(RTC_Output_AlarmA, RTC_OutputPolarity_Low); /* Enable AlarmA interrupt */ RTC_ITConfig(RTC_IT_ALRA, ENABLE); /* Enable the alarmA */ RTC_AlarmCmd(RTC_Alarm_A, ENABLE); RTC_ClearITPendingBit(RTC_IT_ALRA); } rtc_init(); RTC_alarm_config(); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //(_OUT, _AF, _AN) GPIO_InitStructure.GPIO_Speed = GPIO_Speed_400KHz; //(_2MHz, _10MHz, 40MHz) GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //(_NOPULL, _UP) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //(_0 ... _15) GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //(_PP - push/pull, _OD - open drain) GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOC, GPIO_PinSource13, GPIO_AF_RTC_AF1); Прерывание по alarm работает, но ножка PC13 не дергается.
  6. В keil я делаю так: #pragma pack(push, 1) struct as { char tm; int tmp; } #pragma pack(pop)
  7. Точно, именно эта проблема - Half-Open Connection. Я пытался решить ее периодически посылая нули, для того чтобы определить, что соединение разорвано (если ответа на сообщение с нулем нет). Но, после того, как я обнаруживал, что это соединение разорвано - я пытался закрыть его по средствам команды AT+CIPCLOSE=N. И именно в этом случае на этой команде модем и вис. По вашей подсказке посмотрел по keepalive time. SIM900, оказывается, поддерживает эту настройку. Команда AT+CIPTKA, позволяет его активировать и настроить. После чего модем сам определяет через этот timeout, что соединение разорвано (если оно разорвано - Half-Open Connection) и закрывает порт БЕЗ зависания, мне же остается только ловить, ответ от модема N,CLOSED. Спасибо всем за советы.
  8. SIMCOM_Ltd SIMCOM_SIM900 Revision:1137B02SIM900M64_ST_ENHANCE Я не обновлял прошивку. Обязательно ли использовать последнюю пршивку?
  9. Здравствуйте. У меня возникла такая проблема: Используя встроенный стек модема SIM900, я подключаюсь к удаленному серверу (SIM900 клиент). У меня модем должен быть постоянно на связи с сервером. Общение с сервером происходит успешно, успешно открываются и закрываются соединения. НО, если на удаленном сервере неожиданно оборвется связь, то он (удаленный сервер), не успевает сообщить об этом модему. И модем об этом узнает только при попытке отправить серверу сообщение - не придет SEND OK. После не прихода SEND OK, модем продолжает отвечать на команды (например для теста я шлю AT). Но как, только я попытаюсь закрыть это соединение (допустим AT+CIPCLOSE=0), то модем намертво виснет. В принципе, это соединение можно закрыть командой AT+CIPSHUT, но тогда закрываются и все остальные соединения. При работе модема (SIM900) как сервера и подключении к нему удаленных клиентов и последующего неожиданного обрыва связи с этими клиентами со стороны ПК (клиента), происходит тоже самое - соединение остается открытым, а при попытке закрыть его (AT+CIPCLOSE) модем виснет. Может кто-то знает как с этим бороться? Заранее благодарен за любую помощь.
×
×
  • Создать...