Я его полностью поддерживаю.
Программирую на Fuse AtmelAVR.
ИМХО, дело не в коде, а в настройке среды.oleg63m писал(а):я так полагаю, чтобы на такие вопросы отвечать, надо хотя-бы кусочек кода увидеть.
Код: Выделить всё
#include "stm32f2xx.h"
#include "stm32f2xx_conf.h"
#include "FreeRTOS.h"
#include "task.h"
GPIO_InitTypeDef GPIO_InitStructure;
void InitPeriph(void);
void vTaskLED1(void *pvParameters) {
for (;;) {
GPIO_SetBits(GPIOF, GPIO_Pin_6);
vTaskDelay(500);
GPIO_ResetBits(GPIOF, GPIO_Pin_6);
vTaskDelay(500);
}
}
void vTaskLED2(void *pvParameters) {
for (;;) {
GPIO_SetBits(GPIOF, GPIO_Pin_7);
vTaskDelay(321);
GPIO_ResetBits(GPIOF, GPIO_Pin_7);
vTaskDelay(321);
}
}
void vTaskLED3(void *pvParameters) {
for (;;) {
GPIO_SetBits(GPIOF, GPIO_Pin_8);
vTaskDelay(689);
GPIO_ResetBits(GPIOF, GPIO_Pin_8);
vTaskDelay(300);
}
}
void vTaskLED4(void *pvParameters) {
for (;;) {
GPIO_SetBits(GPIOF, GPIO_Pin_9);
vTaskDelay(238);
GPIO_ResetBits(GPIOF, GPIO_Pin_9);
vTaskDelay(861);
}
}
void main()
{
InitPeriph ();
xTaskCreate( vTaskLED1, ( signed char * ) "LED1", configMINIMAL_STACK_SIZE,
NULL, 2,NULL);
xTaskCreate( vTaskLED2, ( signed char * ) "LED2", configMINIMAL_STACK_SIZE,
NULL, 2,NULL);
xTaskCreate( vTaskLED3, ( signed char * ) "LED3", configMINIMAL_STACK_SIZE,
NULL, 2,NULL);
xTaskCreate( vTaskLED4, ( signed char * ) "LED4", configMINIMAL_STACK_SIZE,
NULL, 2,NULL);
vTaskStartScheduler();
}
void InitPeriph(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOF, &GPIO_InitStructure);
}принцип понял.КРАМ писал(а):В контроллерах он сделан на основе логических вентилей и RC-цепей. Изменение частоты производится путем изменения порога переключения вентилей.
Код: Выделить всё
inline void IDLE()
{
MCUCR|=1<<5;
__sleep();
}Видимо, не сбрасывается.If an enabled interrupt occurs while the MCU is in a sleep mode, the MCU wakes up. The MCU is then halted for four cycles in addition to the start-up time, it executes the interrupt routine, and resumes execution from the instruction following SLEEP. The contents of the Register File and SRAM are unaltered when the device wakes up from sleep.
Код: Выделить всё
CLT
SEI
WAIT:
SLEEP
BRTC WAIT
CLI
CLT
, то если вдруг проц сглючит и он каким-то образом выполнит в прерывании команду sleep (нолик там на единичку в коде команды или счетчике команд поменялся), то будет плохо. Или сторожевой таймер спасет? Правда проц за это время может дров наломать...Alexeyslav писал(а):В прерывании использовать режим сна опасно - ведь из сна контроллер выходит по прерыванию, а из следующего он еще не вышел... прерывания-то запрещены
Ну это же не совсем настройка режима. Ведь в принципе, этот бит "лишний" - можно было бы сделать так, что "не хочешь юзать сон - не пиши команду sleep", но его ввели для надежности. Или я что-то не понял?akl писал(а):Никогда, без необходимости, не сбрасываю установленный режим работы.
Код: Выделить всё
outi UBRR0L, low(XTAL/(8*BAUDRATE)-1)
outi UBRR0H, high(XTAL/(8*BAUDRATE)-1)
outi UCSR0A, (1<<U2X0)
outi UCSR0B, (1<<TXEN0)
outi UCSR0C, (1<<UCSZ01)|(1<<UCSZ00)Код: Выделить всё
outi UBRRL, low(XTAL/(8*BAUDRATE)-1)
outi UBRRH, high(XTAL/(8*BAUDRATE)-1)
outi UCSRA, (1<<U2X)
outi UCSRB, (1<<RXCIE)|(1<<RXEN)
outi UCSRC, (1<<UCSZ1)|(1<<UCSZ0)Код: Выделить всё
.equ XTAL = 1000000
.equ BAUDRATE = 9600