Поиск говнокода
Этот поиск практически ничего не может найти! Но вы всё-таки попытайтесь, вдруг повезет.
Найдено: 6
0
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
MEMORY{
ROM(rx) : ORIGIN = 0x08020000, LENGTH = 1920K
SRAM (rwx) : ORIGIN = 0x20020000, LENGTH = 128K
}
_estack = LENGTH(SRAM) + ORIGIN(SRAM);
SECTIONS{
.isr_vector : {
KEEP(*(.isr_vector))
} >ROM
.text : {
. = ALIGN(4);
*(.text)
} >ROM
_sidata = LOADADDR(.data);
.data : {
. = ALIGN(4);
_sdata = .;
*(.data)
. = ALIGN(4);
_edata = .;
} >SRAM AT>ROM
.bss : {
. = ALIGN(4);
_sbss = .;
*(.bss)
. = ALIGN(4);
_ebss = .;
} >SRAM
}
попытка написать блинк под STM32F767VIT6 на плате OpenMV 0V7725-M7
JloJle4Ka,
16 Сентября 2023
+5
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
// Heap memory allocate function (must not be used!)
caddr_t _sbrk(int incr) {
<...>
void some_bastard_called_sbrk();
some_bastard_called_sbrk(); // Produce linker error in case it is used
}
_ATTRIBUTE ((__format__ (__printf__, 1, 2)))
int printf (const char *__restrict format, ...)
{
<маленький трехколесный велосипед>
}
int putchar(int c)
{
<...>
}
int puts(const char *s)
{
<...>
}
_ATTRIBUTE ((__format__ (__printf__, 2, 3)))
int sprintf (char *__restrict s, const char *__restrict format, ...)
{
<...>
}
STM32. Я просто хочу использовать printf для вывода в последовательный порт и не течь. Ведь для этого нужно только реализовать int _write(int file, char *data, int len) и всё. Ой, а почему иногда программа падает где-то в кишках рантайма?
Может, стек переполняется? Да нет, проверил, значения в норме...
Просто стандартная библиотека от ST - это не курсовая ардуинщика, тут все системно, хендлы потоков, дескрипторы устройств и управляющие структуры. При первом обращении printf (и sprintf тоже!) выделяет себе в куче около 400 байт. Замечательное решение, помогающее сэкономить память, если мы не используем стандартный вывод! А куча тут - это просто последовательно заполняемая область памяти, размеры которой задаются в linker script (я вообще 0 указал, я ведь не использую malloc). Проверять выход за пределы кучи мы, конечно, не будем - зачем, когда рядом такая замечательная, никому не нужная область стека.
Да, и если забыть отключить буферизацию setvbuf(stdin/stdout/stderr, NULL, _IONBF, 0); , то он выделит не 400 байт, а килобайт (на контроллере с 8K RAM).
В общем, ах, оставьте меня, сам все напишу.
Только надо еще putchar и puts реализовать, а то компилятор любит printf'ы оптимизировать. И не забыть, что puts добавляет перевод строки. Уф, вроде все.
Steve_Brown,
05 Августа 2022
0
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
void Obmen_RS1(void)
{
uint8_t txbuf[7], rxbuf[43], CheckSum;
//если сформирован запрос на чтение по RS1 - SSPC data
if (SoftFlag.RS_Flag3.bit.RS1_Read_Req)
{
txbuf[0] = 0x7B; //{
txbuf[1] = SSPC_Addr_RS[RS1_Counter];
txbuf[2] = 0x00; //d0, b00000000 - команда для формирования и отправки посылки данных от SSPC
txbuf[3] = 0x00;
txbuf[4] = 0x00;
txbuf[5] = txbuf[1];//(txbuf[1] ^ txbuf[2] ^ txbuf[3] ^ txbuf[4]); //xor [1..4]
txbuf[6] = 0x7D; //}
HAL_UART_Transmit(&huart1, (uint8_t *)&txbuf, 7, 1);
//HAL_Delay(1)
if (HAL_UART_Receive(&huart1, (uint8_t *)&rxbuf, 43, 9) == HAL_OK)
{ //если пришел правильный пакет
if ((rxbuf[0] == 0x5B)
&& (rxbuf[40] == SSPC_Addr_RS[RS1_Counter])
&& (rxbuf[42] == 0x5D))
{ //считаем КС
for (j = 1; j < 41; j++)
CheckSum ^= rxbuf[j];
if (CheckSum == rxbuf[41]) //Если КС совпадает
{
for (j = 1; j < 41; j++) //Сохраняем пакет в двумерный буфер
RS1_Paket[RS1_Counter][j] = rxbuf[j];
}
else
{
for (j = 1; j < 41; j++)
RS1_Paket[RS1_Counter][j] = 0; //Иначе пишем нули
}
}
}
RS1_Counter++;
if (RS1_Counter > 15)
RS1_Counter = 0;
SoftFlag.RS_Flag3.bit.RS1_Read_Req = 0; //сбрасываем флаг запроса чтения данных и ждем следующего по таймеру (100мс)
}
}
Процедура чтения данных от 16 модулей управления нагрузками по RS-485...
для STM32F4x с использованием калокуба
ykypeHHbIu_nemyx,
10 Июля 2019
−4
- 1
- 2
- 3
- 4
<j123123__> Ну лол, я 29-летний бородатый чел из Харькова который живет с мамкой, пишет прошивки под микроконтроллеры STM32
<j123123__> Я не мобилизован потому что например дважды в психбольнице лежал, лол
<j123123__> Ну диагноз тама не говорят, вроде шизо-какое-то расстройство
<j123123__> А вот представь вот в пледик укрыться с кунчиком и на сишечке прогать
Узнаем j123123 с новой стороны.
FrauSchweinhund,
29 Ноября 2018
+9
- 001
- 002
- 003
- 004
- 005
- 006
- 007
- 008
- 009
- 010
- 011
- 012
- 013
- 014
- 015
- 016
- 017
- 018
- 019
- 020
- 021
- 022
- 023
- 024
- 025
- 026
- 027
- 028
- 029
- 030
- 031
- 032
- 033
- 034
- 035
- 036
- 037
- 038
- 039
- 040
- 041
- 042
- 043
- 044
- 045
- 046
- 047
- 048
- 049
- 050
- 051
- 052
- 053
- 054
- 055
- 056
- 057
- 058
- 059
- 060
- 061
- 062
- 063
- 064
- 065
- 066
- 067
- 068
- 069
- 070
- 071
- 072
- 073
- 074
- 075
- 076
- 077
- 078
- 079
- 080
- 081
- 082
- 083
- 084
- 085
- 086
- 087
- 088
- 089
- 090
- 091
- 092
- 093
- 094
- 095
- 096
- 097
- 098
- 099
- 100
if(buf_modem[cntfrommodem] == 'S')
{
cntfrommodem = cntfrommodem + 1 ;
if(buf_modem[cntfrommodem ] == 'R')
{
cntfrommodem = cntfrommodem + 1 ;
if(buf_modem[cntfrommodem] == 'I')
{
cntfrommodem = cntfrommodem + 1 ;
if(buf_modem[cntfrommodem] == 'N')
{
cntfrommodem = cntfrommodem + 1 ;
if(buf_modem[cntfrommodem] == 'G')
{
cntfrommodem = cntfrommodem + 1 ;
if(buf_modem[cntfrommodem] == ':')
{
cntfrommodem = cntfrommodem + 1 ;
if(buf_modem[cntfrommodem] == ' ')
{
cnt_comma = 0;
while(cnt_comma < 2)
{
cntfrommodem = cntfrommodem + 1;
if(buf_modem[cntfrommodem] == ',')
cnt_comma = cnt_comma + 1;
}
cntfrommodem = cntfrommodem + 1 ;
}
}
}else
cntfrommodem -= 4;
}else cntfrommodem -= 3;
}else cntfrommodem -= 2;
}else cntfrommodem--;
}
buf_modem[tmpcntr] = buf_modem[cntfrommodem];
cntfrommodem++;
tmpcntr++;
}
cntfrommodem = 0;
while(1)
{
/// ищем мэдэ5
if(buf_modem[cntfrommodem] == '#')
{
cntfrommodem = cntfrommodem + 1 ;
if(buf_modem[cntfrommodem] == 'S')
{
cntfrommodem = cntfrommodem + 1 ;
if(buf_modem[cntfrommodem ] == 'E')
{
cntfrommodem = cntfrommodem + 1 ;
if(buf_modem[cntfrommodem] == 'R')
{
cntfrommodem = cntfrommodem + 1 ;
if(buf_modem[cntfrommodem] == 'V')
{
cntfrommodem = cntfrommodem + 1 ;
if(buf_modem[cntfrommodem] == 'A')
{
cntfrommodem = cntfrommodem + 1 ;
if(buf_modem[cntfrommodem] == 'N')
{
cntfrommodem = cntfrommodem + 1 ;
if(buf_modem[cntfrommodem] == 'S')
{
cntfrommodem = cntfrommodem + 1 ;
if(buf_modem[cntfrommodem] == 'W')
{
cntfrommodem = cntfrommodem + 1 ;
if(buf_modem[cntfrommodem] == ':')
{
cntfrommodem = cntfrommodem + 1 ;
if(buf_modem[cntfrommodem] == ' ')
{
Парсинг ответа от GSM-модема. Код из реального проекта для STM32.
Tronix,
15 Июня 2016
+147
- 001
- 002
- 003
- 004
- 005
- 006
- 007
- 008
- 009
- 010
- 011
- 012
- 013
- 014
- 015
- 016
- 017
- 018
- 019
- 020
- 021
- 022
- 023
- 024
- 025
- 026
- 027
- 028
- 029
- 030
- 031
- 032
- 033
- 034
- 035
- 036
- 037
- 038
- 039
- 040
- 041
- 042
- 043
- 044
- 045
- 046
- 047
- 048
- 049
- 050
- 051
- 052
- 053
- 054
- 055
- 056
- 057
- 058
- 059
- 060
- 061
- 062
- 063
- 064
- 065
- 066
- 067
- 068
- 069
- 070
- 071
- 072
- 073
- 074
- 075
- 076
- 077
- 078
- 079
- 080
- 081
- 082
- 083
- 084
- 085
- 086
- 087
- 088
- 089
- 090
- 091
- 092
- 093
- 094
- 095
- 096
- 097
- 098
- 099
- 100
void Write_Char(char ch)
{
switch(ch)
{
case 'a':
{
set_mode_data;
set_db4_0;
set_db5_1;
set_db6_1;
set_db7_0;
strobe();
set_mode_data;
set_db4_1;
set_db5_0;
set_db6_0;
set_db7_0;
strobe();
return;
}
case 'b':
{
set_mode_data;
set_db4_0;
set_db5_1;
set_db6_1;
set_db7_0;
strobe();
set_mode_data;
set_db4_0;
set_db5_1;
set_db6_0;
set_db7_0;
strobe();
return;
}
case 'c':
{
set_mode_data;
set_db4_0;
set_db5_1;
set_db6_1;
set_db7_0;
strobe();
set_mode_data;
set_db4_1;
set_db5_1;
set_db6_0;
set_db7_0;
strobe();
return;
}
case 'd':
{
set_mode_data;
set_db4_0;
set_db5_1;
set_db6_1;
set_db7_0;
strobe();
set_mode_data;
set_db4_0;
set_db5_0;
set_db6_1;
set_db7_0;
strobe();
return;
}
case 'e':
{
set_mode_data;
set_db4_0;
set_db5_1;
set_db6_1;
set_db7_0;
strobe();
set_mode_data;
set_db4_1;
set_db5_0;
set_db6_1;
set_db7_0;
strobe();
return;
}
case 'f':
{ set_mode_data;
set_db4_0;
set_db5_1;
set_db6_1;
set_db7_0;
strobe();
set_mode_data;
set_db4_0;
set_db5_1;
set_db6_1;
set_db7_0;
strobe();
return;
}
//еще ~800 строк.
Ну почему тут только 100 строк можно вводить? Я хочу поделиться этим со всем миром, ведь это так легко - наговнокодить на Си.(из программы общения с дисплеем hd44780 для STM32)
Fantom,
28 Апреля 2015