Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
7 / 7 / 0
Регистрация: 26.11.2018
Сообщений: 262

Не хватает FLASH памяти на микроконтроллере

01.02.2021, 14:33. Показов 6548. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю проект на STM32F103, использую HAL. В проекте есть модули GPS, GSM, fingerprint, OLED экран, клавиатура, и сенсоры.
Реализованиє части: GPS, GSM, fingerprint, экран, клавиатура, часть сенсоров.
В данном микроконтроллере только 64 Кб флэш памяти. И сейчас я использовал 99.48%. Но мне нужно реализовать еще другой функционал. Заменить на другой микроконтроллер возможности нет.
Вопрос.
1. Можно сжимать прошивку в STM32IDE?
2. Я заметил что много флэш памяти занимают вывода информации на экран. Можно ли это как-то оптимизировать по флэш памяти?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// Clearn OLED
    ssd1306_Fill(Black);
    ssd1306_UpdateScreen();
    // Fingerprint code place where
    // Print modes on OLED
    char str_fingerprint[30]={0};
    memset(str_fingerprint, 0 , sizeof(str_fingerprint));
    sprintf(str_fingerprint,"%s", "3.FINGERPRINT");
    ssd1306_SetCursor(00, 00);
    ssd1306_WriteString(str_fingerprint, Font_7x10, White);
 
    // Print meu fingerprint
    memset(str_fingerprint, 0 , sizeof(str_fingerprint));
    sprintf(str_fingerprint,"%s", "1. Enroll finger");
    ssd1306_SetCursor(00, 16);
    ssd1306_WriteString(str_fingerprint, Font_7x10, White);
 
    memset(str_fingerprint, 0 , sizeof(str_fingerprint));
    sprintf(str_fingerprint,"%s", "2. Delete all IDs");
    ssd1306_SetCursor(00, 26);
    ssd1306_WriteString(str_fingerprint, Font_7x10, White);
 
    memset(str_fingerprint, 0 , sizeof(str_fingerprint));
    sprintf(str_fingerprint,"%s", "3. Identify");
    ssd1306_SetCursor(00, 36);
    ssd1306_WriteString(str_fingerprint, Font_7x10, White);
 
    memset(str_fingerprint, 0 , sizeof(str_fingerprint));
    sprintf(str_fingerprint,"%s", "'*' to EXIT");
    ssd1306_SetCursor(00, 46);
    ssd1306_WriteString(str_fingerprint, Font_7x10, White);
 
    ssd1306_UpdateScreen();
3. Какие еще есть варианты оптимизации по FLASH?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.02.2021, 14:33
Ответы с готовыми решениями:

Прошивка параллельной FLASH памяти на микроконтроллере LPC4350
Такой вопрос, как прошивается такая память? Есть алгоритм для этой прошивки, но этот алгоритм существует для среды Keil. у меня же есть...

Выводится сообщение о том, что не хватает памяти, хотя памяти хватает
Файлы подкачки отключил и включать не собираюсь. Когда свободной памяти остаётся примерно гиг-полтора начинают "помирать"...

Не хватает памяти
Здравствуйте! В задаче "E. ОПТОВОЛОКНО 2" (условия прикрепляю) во входных данных оговорено, что максимально может быть 4*10^6=4 000 000...

32
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
02.02.2021, 16:59
Студворк — интернет-сервис помощи студентам
окей, но возвращаясь к цитате Не хватает FLASH памяти на микроконтроллере - речь идет о
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
between the evaluations of the first
and second operands
Это логично, потому что именно от "исхода" первого условия, и дальнейшего знака потом решается, будет ли проверяться дальнейшее выражение.

PS: я для наглядности, по-баловался с простыми условиями:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/******************************************************************************
 
                            Online C Compiler.
                Code, Compile, Run and Debug C program online.
Write your code in this editor and press "Run" button to compile and execute it.
 
*******************************************************************************/
 
#include <stdio.h>
 
int main()
{
    if (1==1 && 2==1 || 1==1 && 3==2) {
        printf("Hello World");
    } else {
        printf("Be silent");
    }
 
    return 0;
}
...меняя второе и третье условия в выражении, мы получаем разные разультаты (https://onlinegdb.com/u-VDJmhoT).
0
Эксперт .NET
 Аватар для Rius
13391 / 7846 / 1699
Регистрация: 25.05.2015
Сообщений: 23,855
Записей в блоге: 14
02.02.2021, 17:03
Цитата Сообщение от Voland_ Посмотреть сообщение
второе и третье условия в выражении
Что вы понимаете под вторым и третьим?...

Добавлено через 1 минуту
Т.е. покажите оба варианта записи, так понятнее.
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
02.02.2021, 17:09
второй вариант:
C
1
if (1==1 && 1==1 || 2==1 && 3==2) {
первый вариант:
C
1
if (1==1 && 2==1 || 1==1 && 3==2) {
PS: еще интереснее, если вы начинаете разделять условия скобками
0
Эксперт .NET
 Аватар для Rius
13391 / 7846 / 1699
Регистрация: 25.05.2015
Сообщений: 23,855
Записей в блоге: 14
02.02.2021, 17:34
Цитата Сообщение от Voland_ Посмотреть сообщение
меняя второе и третье условия в выражении, мы получаем разные разультаты
Так они и должны быть разными, даже без компилятора можно вычислить. Что не так?

Добавлено через 9 минут
Цитата Сообщение от Voland_ Посмотреть сообщение
еще интереснее, если вы начинаете разделять условия скобками
Их и нужно разделять скобками. Не надо полагаться на то, что читатель кода (а особенно писатель!) будет помнить приоритеты операций.
0
 Аватар для COKPOWEHEU
4144 / 2722 / 433
Регистрация: 09.09.2017
Сообщений: 12,058
02.02.2021, 17:42
Цитата Сообщение от Voland_ Посмотреть сообщение
PS: еще интереснее, если вы начинаете разделять условия скобками
А вот с приоритетами операций надо быть поосторожнее. Вдруг логическое умножение (&&) имеет приоритет над сложением?
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
02.02.2021, 18:12
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А вот с приоритетами операций надо быть поосторожнее.
представленный выше код [по идее] имеет одноранговый приоритет. В результате всех вариантов выражения должен получаться "false". Но, по факту получается это не так, и приоритет имеют операции, заявленные слева.

PS: это также по не опровергает заявление, что операции всегда рассматриваются слева направо. Если бы наоборот - в результате так бы и получался бы всегда "false".
0
Эксперт .NET
 Аватар для Rius
13391 / 7846 / 1699
Регистрация: 25.05.2015
Сообщений: 23,855
Записей в блоге: 14
02.02.2021, 18:16
Цитата Сообщение от Voland_ Посмотреть сообщение
имеет одноранговый приоритет
В смысле, что && и || имеют одинаковый приоритет? Так это не так, разный.
1
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
02.02.2021, 18:32
Цитата Сообщение от Rius Посмотреть сообщение
В смысле, что && и || имеют одинаковый приоритет? Так это не так, разный.
ну, тогда становится понятно, почему мы имеем такие ответы в приведенных примерах ).
0
 Аватар для COKPOWEHEU
4144 / 2722 / 433
Регистрация: 09.09.2017
Сообщений: 12,058
02.02.2021, 18:33
Цитата Сообщение от Voland_ Посмотреть сообщение
представленный выше код [по идее] имеет одноранговый приоритет.
Еще раз. Вы утверждаете что у сложения и умножения одинаковый приоритет?
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
02.02.2021, 18:42
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Еще раз. Вы утверждаете что у сложения и умножения одинаковый приоритет?
нет, я разобрался почему у меня были неправильные выводы сделаны. Теперь все понятно ).
0
7 / 7 / 0
Регистрация: 26.11.2018
Сообщений: 262
03.02.2021, 16:08  [ТС]
Итак, я заменил практически во всех местах повторяющуюся конструкцию:

C
1
2
3
4
5
            sprintf(str,"%s", number);
            ssd1306_SetCursor(00, 26);
            ssd1306_WriteString(str, Font_7x10, White);
            memset(str, 0 , sizeof(str));
            ssd1306_UpdateScreen();
На:
C
1
2
3
4
5
6
7
8
9
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
print_text_on_OLED(0, 2, true, "Enter number:");
 
// -----------------------------------------------------------------------------------
// Print any text on OLED
void print_text_on_OLED(uint8_t column, uint8_t row, bool update_oled, char text[])
{
    char message_buffer[30] = {0};
 
    switch (row)
    {
        case 1:
            ssd1306_SetCursor(column, 0);
        break;
 
        case 2:
            ssd1306_SetCursor(column, 16);
        break;
 
        case 3:
            ssd1306_SetCursor(column, 26);
        break;
 
        case 4:
            ssd1306_SetCursor(column, 36);
        break;
 
        case 5:
            ssd1306_SetCursor(column, 46);
        break;
    }
    ssd1306_WriteString(text, Font_7x10, White);
 
    if(update_oled == true)
    {
        ssd1306_UpdateScreen();
    }
}
// ----------------------------------------------------------------------------
Удалось уменьшить использование флэш памяти практически на 10%. Теперь 90.59%
0
Эксперт по электронике
7146 / 3325 / 342
Регистрация: 28.10.2011
Сообщений: 13,119
Записей в блоге: 7
03.02.2021, 16:23
https://ru.cppreference.com/w/... precedence
0
658 / 411 / 76
Регистрация: 21.09.2008
Сообщений: 1,411
07.02.2021, 19:12
Цитата Сообщение от locm Посмотреть сообщение
выбросьте sprintf и напишите свои, более оптимальные аналоги этих функций.
Сделано за нас.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.02.2021, 19:12

не хватает памяти
создаю bitmap unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, ...

Не хватает памяти
Arduino UNO R3 + Ethernet Sfield W5100 библиотеки #include &quot;SPI.h&quot; #include &quot;Ethernet.h&quot; #include &quot;EthernetUdp.h&quot; #include...

Не хватает памяти
Приветствую, ребята. Есть вот такой код: Task&lt;ObservableCollection&lt;RecordRegZhur&gt;&gt; task_get_data = new...

Не хватает памяти
Привет всем! Ребята,может я что-то не так понимаю,но по скрину видно,что у меня 8гб.памяти а в диспетчере показывает,что используется около...

Не хватает памяти
Здравствуйте, недавно поменял gtx 750 на 1070, после смены видеокарты в некоторых играх спустя несколько минут игры, вылазит ошибка о...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс Ссылка на сгенерированную музыкальную композицию: https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013 Я говорю, что Время- как вода течет. . .
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru