Двойная буферизация на lpc1788

Я столкнулся с большой проблемой. В настоящее время я участвую в сэндвич-курсе и самостоятельно изучаю, как разрабатывать программное обеспечение для встроенной системы - как это бывает, на плате open1788.

Я планировал реализовать функцию двойной буферизации, потому что на моем ЖК-экране можно увидеть мерцание. Фигуры можно просматривать во время рисования!

При двойной буферизации перерисовка всего экрана происходит достаточно быстро. Может быть, мне следует покопаться в управлении отсечением, чтобы мне нужно было перерисовывать только те части экрана, которые должны быть? Но это не вопрос.

Итак, я написал пару функций для обработки выбора варианта двойной буферизации. Если я не хочу, чтобы программа использовала двойную буферизацию, то я не буду выделять для нее память; в противном случае я делаю.

Проблема в том, что пространство по умолчанию, выделенное для кучи, достигает 1024 байт. А мой временный буфер имеет длину 261120 байт! (481 пиксель в ширину на 272 пикселя в высоту, каждый 16bpp).

Как следствие, malloc вернул NULL.

Первое решение, которое я принял, — поставить статический буфер, я имею в виду:

static WORD s_double_buf[481*272];

Но очевидным недостатком является то, что он все равно выделяется, даже если вы не используете двойную буферизацию.

Второе решение — отредактировать файл конфигурации, чтобы увеличить кучу, заменив 1024 байта, например, на 1048576 байт (0x100000). Мне не нравится это решение, так как я должен сосредоточиться на экономии места в памяти.

Может быть, мне ужасно не хватает навыков встроенного программирования? Какое лучшее решение в соответствии с этим? Как я мог добиться прогресса? Я не говорю вам о своей беспорядочной способности читать и копаться в даташитах.

Я был бы очень признателен, если бы кто-нибудь мог предоставить мне ссылки для начинающих, в основном для платы, на которой я программирую.

Заранее спасибо!


person Geoffrey R.    schedule 08.01.2013    source источник
comment
Судя по тому, что я видел, встроенные библиотеки обычно ограничивают кучу, чтобы она могла доходить до стека (минус некоторое фиксированное значение). Если вы не выделяете память в кучу (и не используете много стека), как и для чего вы собираетесь ее использовать?   -  person dbrank0    schedule 09.01.2013
comment
Я буду использовать кучу для динамического создания экземпляров виджетов GUI, управления коллекциями и так далее.   -  person Geoffrey R.    schedule 09.01.2013
comment
Я имел в виду, какой смысл в свободной памяти, если вы не можете использовать ее для кучи (и не нужно столько стека). т.е. Я бы просто изменил скрипт компоновщика, чтобы у меня был минимальный стек (ровно столько, сколько требуется), а остальное использовалось бы для кучи.   -  person dbrank0    schedule 09.01.2013
comment
Боюсь, я все еще не понимаю вашего точного вопроса. Вы имеете в виду свободную память под памятью вне стека/кучи, например, статические и глобальные переменные, которые будут храниться в разделе .bss/.data в двоичных файлах Windows/Linux? Не могу сказать вам эквивалент во встроенной среде. Должен вам сказать, что я не думал об этом. Так должен ли я хранить свой двойной буфер в этой области памяти?   -  person Geoffrey R.    schedule 09.01.2013
comment
Нет, я думаю, вам следует отредактировать файл конфигурации, чтобы увеличить кучу. Потому что как еще вы будете использовать лишнюю память?   -  person dbrank0    schedule 09.01.2013
comment
Думаю, со стеком, но он довольно ограничен, и мне пришлось бы передавать адреса памяти через функции. Я сделал кучу больше, поэтому она работает нормально, но в основном я хотел знать, является ли это своего рода хорошей практикой или нет.   -  person Geoffrey R.    schedule 09.01.2013
comment
Дополнительная встроенная литература: barrgroup.com/Embedded-Systems/How-To и ganssle.com   -  person Martin Thompson    schedule 09.01.2013


Ответы (2)


Во встроенной системе вы обычно хотите выделить всю свою память при запуске. Это означает, что вы уже знаете, что у вас достаточно для всего, что вы хотите сделать, что означает, что он не может дать сбой в работе, что обычно хорошо, особенно для встроенной системы.

Статически выделять память — это просто, и похоже, что у вас ее в избытке. Если позднее вы обнаружите, что у вас закончилась память и можно обойтись без двойной буферизации, вы можете так же легко ее удалить.

Если вы используете malloc, сделайте все это при запуске, тогда вам не придется заниматься восстановлением после нехватки памяти во время нормальной работы.

person Martin Thompson    schedule 09.01.2013
comment
Достаточно честно, так что я думаю, мне нужно выделить какие-то пулы, и тогда я не переполню их, не так ли? - person Geoffrey R.; 09.01.2013
comment
Если вам нужно иметь (непредсказуемое) динамическое выделение памяти во время выполнения, вы можете использовать malloc или свой собственный распределитель. В любом случае вам нужно выяснить, что делать, когда вы закончите и должны вернуть NULL. - person Martin Thompson; 09.01.2013

Во встроенном пространстве вы обычно решаете фундаментальные аспекты, например, использовать ли двойную буферизацию во время компиляции, а не во время выполнения. Поэтому вполне допустимо использовать препроцессор и условную компиляцию:

#ifdef WITH_DOUBLEBUFFERING

    static WORD s_double_buf[481*272];
    #define SCREEN s_double_buf

#else

    #define SCREEN your_real_framebuffer

#endif

В реализации вашей библиотеки графического интерфейса вы должны рисовать на SCREEN.

person edgar.holleis    schedule 09.01.2013