|
Ламерские вопросы по Си, перехожу с асма |
|
|
|
May 19 2012, 06:34
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Добрый день. Копаю интернет, но все как-то безуспешно. Хочу написать функцию передачи строки по UART, работающую по прерыванию. Причем строка может быть как константа (храниться во флэш), так и переменная (храниться в СОЗУ). Код #define size_TX0 10 volatile static int8_t count_TX0;//кол-во непереданных символов в буфере UART0 volatile static int8_t index_TX0;//адресация в буфере передачи UART0 volatile static int8_t bufferTX0[size_TX0];//массив - буфер передачи UART0 /*==============================*/ void send_UART0(char *string) { int8_t i; for(i=0;*string!='\0';i++) { bufferTX0[i]=(*string); //сохраняем строку в буфер string++; count_TX0++; //считаем символы } index_TX0=0; //обнуляем адресацию в буфере sbi(UCSR0B,UDRIE0); //запускаем прерывание } /*==============================*/ ISR(USART0_UDRE_vect) { UDR0 = bufferTX0[index_TX0++]; // Берем данные из буффера. if(index_TX0==count_TX0) cbi(UCSR0B,UDRIE0); // Если все передали, то выкл.прерывание } /*==============================*/ Пишу send_UART0("12345");, но эти 12345 сохраняются в СОЗУ. Вопрос: как передать в функцию строку, чтобы она сохранилась во флэш? Спасибо.
Сообщение отредактировал Alt.F4 - May 19 2012, 06:36
|
|
|
|
|
 |
Ответов
|
May 19 2012, 07:54
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Хм... Я не силён в терминологии разряда «цветовой дифференциации штанов», но в моём понимании «ламер» означает человека, который не просто не знает чего-то (все чего-то не знают *) ), а и не желает разобраться и при этом ещё пробует учить других. «ламерский вопрос» при этом редкость и обычно сам он своим уровнем хорошо показывает, что в предыдущих своих сообщениях человек с умным видом рассуждал о том, чего совершенно не знает. «нуб», в отличие от «ламера», хочет что-от узнать. Один и тот же вопрос может быть «ламерским» или «чайниковским» в зависимости от того, кто его задал (от предистории). Ну да не важно. Судя по тому, что соседний вопрос был по AVR Studio, используется avr-gcc. У него до версии 4.7 не поддерживаются разные пространства памяти и соответствующие модификаторы указателей (да и в 4.7, если я правильно понял, это есть в C frontend, но нет в C++). Так что нужно использовать атрибут размещения из avr/pgmspace.hУниверсальную функцию написать можно, сначала придумав, как передавать признак ОЗУ/флеш. Две специальных написать проще и результат не хуже. И это будет выглядеть как-то так: CODE #include <avr/pgmspace.h>
#define size_TX0 10
// беззнаковые счётчики и индексы дают код короче и быстрее volatile static unt8_t count_TX0; //кол-во непереданных символов в буфере UART0 volatile static unt8_t index_TX0; //адресация в буфере передачи UART0 // char так char, какая нам разница, какой размер и знак у символов volatile static char bufferTX0[size_TX0];//массив - буфер передачи UART0 ...
void wait_UART0() { while (UCSR0B & (1<<UDRIE0)) {} }
void start_UART0() { index_TX0 = 0; UCSR0B |= (1<<UDRIE0); }
// Строка из ОЗУ void send_UART0(char *string) { char *dst = buffer_TX0; char ch;
wait_UART0(); // надо ведь дождаться, пока уйдёт предыдущая строка
count_TX0 = 0;
// бесконечный цикл, тут прямо в условие действия затолкать для новичка возможно слишком уж нечитаемо выйдет for (;;) { ch = *string++; // если достигнут конец строки или уже нет местя в буфере — выходим if (ch == '\0' || ++count_TX0 >= size_TX0) break; *dst++ = ch; }
start_UART0(); }
... // Строка из флеша. // Увы, нормальной поддержки указатеелй во флеше нет, поэтому проще не обманывать себя void send_UART0_P(unsigned string_address) { char *dst = buffer_TX0; char ch;
wait_UART0();
count_TX0 = 0;
for (;;) { ch = pgm_read_byte(string_address); ++string_address; if ( ch == '\0' || ++count_TX0 >= size_TX0) break; *dst++ = ch; }
start_UART0(); }
... send_UART0_P( PSTR("Temperature: ") ); // эта строка не попадёт в ОЗУ char tmpbuf[size_TX0]; // к примеру, преобразовали в буфер число send_UART0( tmpbuf ); send_UART0_P( PSTR("\r\n") ); // эта строка не попадёт в ОЗУ
____________ *) Не знать — не стыдно. Стыдно не хотеть узнать.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
Сообщений в этой теме
Alt.F4 Ламерские вопросы по Си May 19 2012, 06:34 Dog Pawlowa Если нужно флэш, то как-то так:
__flash char my_st... May 19 2012, 07:19 demiurg_spb Цитата(Dog Pawlowa @ May 19 2012, 10:19) ... May 19 2012, 20:32  defunct Строки наверное удобней выводить printf'ом. fo... May 21 2012, 00:33   ReAl Цитата(defunct @ May 21 2012, 03:33) Стро... May 23 2012, 10:31 Alt.F4 ЦитатаДве специальных написать проще и результат н... May 20 2012, 11:17 Alt.F4 Возник новый вопрос. Прочел, что хорошим тоном явл... May 23 2012, 03:11 Сергей Борщ QUOTE (Alt.F4 @ May 23 2012, 06:11) Что э... May 23 2012, 05:48 Alt.F4 Сергей Борщ, спасибо большое!!! May 23 2012, 06:15 Alt.F4 Имеем массив в EEPROM и указатель на него:
КодEEME... Jun 2 2012, 15:11 _Артём_ Цитата(Alt.F4 @ Jun 2 2012, 18:11) Имеем ... Jun 2 2012, 15:27 mempfis_ Цитата(Alt.F4 @ Jun 2 2012, 18:11) Имеем ... Jun 2 2012, 15:32 Alt.F4 Цитатаили так можно:
Кодunsigned int addr_EE;
addr... Jun 2 2012, 15:42 _Артём_ Цитата(Alt.F4 @ Jun 2 2012, 18:42) Если д... Jun 2 2012, 16:02 Alt.F4 ЦитатаEEAR = (unsigned short)addr_EE;Варнинг исчез... Jun 2 2012, 16:06 Alt.F4 Delete. Jun 3 2012, 12:55 Alt.F4 Здравствуйте.
Столкнулся с новой проблемой, прокля... Aug 6 2012, 09:58 MrYuran Цитата(Alt.F4 @ Aug 6 2012, 13:58) Как av... Aug 6 2012, 11:19 aaarrr Изложите проблему менее абстрактно: что именно нап... Aug 6 2012, 10:01 Alt.F4 aaarrr, ё-мана, это оказывается в Source Files (AV... Aug 6 2012, 10:14 _Pasha Цитата(Alt.F4 @ Aug 6 2012, 13:14) ё-мана... Aug 6 2012, 12:33  maksimp Цитата(_Pasha @ Aug 6 2012, 16:33) но их ... Aug 6 2012, 18:45   Сергей Борщ QUOTE (maksimp @ Aug 6 2012, 21:45) В про... Aug 6 2012, 19:00    dxp QUOTE (Сергей Борщ @ Aug 7 2012, 02:00) В... Aug 7 2012, 03:32    AHTOXA Цитата(Сергей Борщ @ Aug 7 2012, 01:00) В... Aug 7 2012, 03:43 Alt.F4 Подскажите, пожалуйста, как описать массив структу... Oct 4 2012, 07:03 MrYuran Цитата(Alt.F4 @ Oct 4 2012, 11:03) Подска... Oct 4 2012, 07:23 _Артём_ Цитата(Alt.F4 @ Oct 4 2012, 10:03) Подска... Oct 4 2012, 08:20 demiurg_spb Кодtypedef struct
{
uint8_t code;
const uint... Oct 4 2012, 12:02 Alt.F4 MrYuran, компилятор пишет: ../font.h:1362:... Oct 4 2012, 07:51 MrYuran Цитата(Alt.F4 @ Oct 4 2012, 11:51) MrYura... Oct 4 2012, 08:37 xemul Правильно пишет.
uint8_t * index
uint8_t font_0x31... Oct 4 2012, 08:20 Alt.F4 А как тогда объявить указатель на массив во флэш?
... Oct 4 2012, 08:28 _Артём_ Цитата(Alt.F4 @ Oct 4 2012, 11:28) з.ы. Р... Oct 4 2012, 08:41 Alt.F4 ЦитатаПравда FontTable тоже во флешь можно размест... Oct 4 2012, 18:29 _Артём_ Цитата(Alt.F4 @ Oct 4 2012, 21:29) Да, по... Oct 4 2012, 19:39  demiurg_spb Цитата(_Артём_ @ Oct 4 2012, 23:39) Не со... Oct 5 2012, 05:47   _Артём_ Цитата(demiurg_spb @ Oct 5 2012, 08:47) Н... Oct 5 2012, 14:13    demiurg_spb Цитата(_Артём_ @ Oct 5 2012, 18:13) Да оп... Oct 5 2012, 14:18 Alt.F4 Цитатаа чтобы читать из флеша или eeprom нужно чер... Oct 5 2012, 09:47 demiurg_spb Цитата(Alt.F4 @ Oct 5 2012, 13:47) Вроде ... Oct 5 2012, 10:39 demiurg_spb . Oct 5 2012, 12:05
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|