Ура, наконец-то я понял, что означала фраза "транзистор работает за счет захвата коллектором основных носителей, инжектируемых эмиттером в базу", когда изучал электронику в институте.
У меня 8 ГБ ОЗУ, своп не используется. Иногда какой-то процесс отжирает всё ОЗУ, и система впадает в ступор минут на 20-30, непрерывно светя индикатором жёсткого диска. После этого этот процесс убивается, память освобождается и всё продолжает работать нормально. Но что происходит в эти 20-30 минут?
Объяснение очень простое. Использование констант таким образом позволяет поиграться с их разными значениями в отладчике, не перепрошивая девайс всякий раз.
После Ctrl-r надо набрать название регистра (что-то вроде именованного буфера обмена), из которого вставлять текст. В данном случае "правильнее" набрать двойную кавычку (регистр по умолчанию), т.е. <Ctrl-r>";<Esc>. Или можно <Ctrl-o>p;<Esc>.
Перенос левого мизинца на Esc делается без отрыва кисти от поверхности в отличие от переноса всего правого предплечья на блок стрелок (и тем более на мышь).
Мне как раз нравится из-за названий, по-моему, очень читабельно, особенно если параметры не такие очевидные, как UARTSpeed115200. И узнал я о таком способе весьма недавно из книги «21st Century C» (Ben Klemens).
Бит TC в регистре статуса, прерывание от него маскируется битом TCIE в USART_CR1.
Вызов pxMBFrameCBTransmitterEmpty() в UART_IRQ_Handler() при передаче последнего байта вызывает vMBPortSerialEnable( TRUE, FALSE ), что выключает DE в то время как этот байт только начал передаваться по линии.
По поводу костыля. Вы обрабатываете событие TXE передатчика, поэтому линия DE деактивируется в момент начала передачи последнего байта, а не тогда, когда этот байт уже целиком «выдвинется». Поэтому либо Ваш костыль, либо после записи последнего байта нужно ждать события TC (transmission complete).
Вообще-то не все люди нуждаются в том, чтобы гнобить и унижать более слабых, будь то в школе, в армии или на работе. Так что не равняйте всех по себе.
Спасибо, очень наглядно. Увидел, что Вы это и в статье объясняли, просто я сразу не разобрался.
Поясните, пожалуйста, момент, зачем нужно
irq_disable
перед WFI. И что делает irq_disable — cpsid i или что?Ура, наконец-то я понял, что означала фраза "транзистор работает за счет захвата коллектором основных носителей, инжектируемых эмиттером в базу", когда изучал электронику в институте.
"he didn't make it" означает "он погиб".
А самые продвинутые уже говорят: "Вы сделали мой день"
Почему они говорят "he didn't make it" вместо "he hasn't made it" ?
У меня 8 ГБ ОЗУ, своп не используется. Иногда какой-то процесс отжирает всё ОЗУ, и система впадает в ступор минут на 20-30, непрерывно светя индикатором жёсткого диска. После этого этот процесс убивается, память освобождается и всё продолжает работать нормально. Но что происходит в эти 20-30 минут?
Объяснение очень простое. Использование констант таким образом позволяет поиграться с их разными значениями в отладчике, не перепрошивая девайс всякий раз.
У меня вот в микроконтроллере стек uIP крутится, там есть функция uip_process — 1118 строк + 69 goto, а тут какие-то жалкие тойотовские 740 строк.
После Ctrl-r надо набрать название регистра (что-то вроде именованного буфера обмена), из которого вставлять текст. В данном случае "правильнее" набрать двойную кавычку (регистр по умолчанию), т.е.
<Ctrl-r>";<Esc>
. Или можно<Ctrl-o>p;<Esc>
.Либа:
typedef struct UARTConfigT
{
UARTSpeedT speed;
UARTStopT stop;
UARTParityT parity;
} UARTConfigT;
int UARTConfigUse(UARTConfigT config)
{
return DoSomething();
}
// инициализация со значениями по умолчанию
#define UARTConfig(...) UARTConfigUse((UARTConfigT){.speed = UARTSpeed9600, .stop = UARTStop1, .parity = UARTParityNone, __VA_ARGS__})
Инициализация с нужными параметрами:
UARTConfig(.speed = UARTSpeed115200, .parity = UARTParityEven);
Вызов pxMBFrameCBTransmitterEmpty() в UART_IRQ_Handler() при передаче последнего байта вызывает vMBPortSerialEnable( TRUE, FALSE ), что выключает DE в то время как этот байт только начал передаваться по линии.