Пн окт 09, 2017 17:51:26
Пн окт 09, 2017 19:21:39
Пн окт 09, 2017 19:36:26
Пн окт 09, 2017 20:00:26
Пн окт 09, 2017 20:11:07
Пн окт 09, 2017 20:14:37
Пн окт 09, 2017 21:30:04
Вт окт 10, 2017 07:10:19
еще как реальны! но инициализировать их СТРОКАМИ не очень удобно. можно, но чуть-чуть геморно. всё дело в том, что AVR-GCC не может одновременно присваивать строковое значение полю структуры и объявлять строковую константу. делать это придётся отдельно... то есть как-то так:afz писал(а):структуры в PROGMEM, действительно, нереальны
typedef struct{
int a;
char b;
char *str;
} my_struct;
PROGMEM char my_str1[] = "string 1";
PROGMEM char my_str2[] = "string 2";
PROGMEM char my_str3[] = "string 3";
PROGMEM char my_str4[] = "string 4";
#define str_init(x,y,z) {.a=x, .b=y, .str=z}
PROGMEM my_struct array[4] = {
str_init(1,2,my_str1),
str_init(3,4,my_str2),
str_init(5,6,my_str3),
str_init(7,8,my_str4)
}
Вт окт 10, 2017 08:12:50
typedef struct{
uint16_t freq;
char name[16];
} my_struct;
const my_struct array[] PROGMEM = {
{9890, "Russian"},
{9950, "Unistar"},
};
Вт окт 10, 2017 13:46:38
#define RADIO_LIST \
RADIO_ITEM(10450, "string 1") \
RADIO_ITEM(10520, "string 2") \
RADIO_ITEM(10640, "string 3") \
RADIO_ITEM(10680, "string 4")
typedef struct _radio_t {
int freq;
const char *name;
} radio_t;
/* Объявляем строки */
#define RADIO_ITEM(f,s) PROGMEM char radio_name_##f [] = s;
RADIO_LIST
#undef RADIO_ITEM
/* Объявляем массив, в котором указатели на объявленные ранее строки */
#define RADIO_ITEM(f,s) { .freq=f, .name=radio_name_##f },
PROGMEM radio_t radio_array [] = {
RADIO_LIST
};
#define RADIO_LIST_SZ (sizeof (radio_array)/sizeof(radio_t))
Вт окт 10, 2017 13:52:22
вот это здорово! сам мучился всегда с разбросанными в разных местах строками и связанными с ними логически остальными вещами - беру на вооружение ваш подход!viiv писал(а):чуть подправил пример
Вт окт 10, 2017 15:38:53
Вт окт 10, 2017 15:58:13
Вт окт 10, 2017 18:22:45
// Создаем функции с одинаковым количеством параметров
// и соответствующими типами, а так же возвращаемым типом
void m0 (void) {
PORT_VID.VID_PIN = 0;
PORT_VID.VID_PIN = 0;
PORT_VID.VID_PIN = 0;
PORT_VID.VID_PIN = 0;
PORT_VID.VID_PIN = 0;
PORT_VID.VID_PIN = 0;
PORT_VID.VID_PIN = 0;
PORT_VID.VID_PIN = 0;
}
void m1 (void) {
PORT_VID.VID_PIN = 1;
PORT_VID.VID_PIN = 0;
PORT_VID.VID_PIN = 0;
PORT_VID.VID_PIN = 0;
PORT_VID.VID_PIN = 0;
PORT_VID.VID_PIN = 0;
PORT_VID.VID_PIN = 0;
PORT_VID.VID_PIN = 0;
}
void m2 (void) {
PORT_VID.VID_PIN = 0;
PORT_VID.VID_PIN = 1;
PORT_VID.VID_PIN = 0;
PORT_VID.VID_PIN = 0;
PORT_VID.VID_PIN = 0;
PORT_VID.VID_PIN = 0;
PORT_VID.VID_PIN = 0;
PORT_VID.VID_PIN = 0;
}
// Я три создал, для проверки что это будет работать
// создаем новый прототип (в данном случае указатель на функцию)
typedef void (*fptr)(void);
fptr arr[3]; // объявляем массив функций в данном случае из трех элементов
// помещаем в массив функции указывая их имена (имя функции это и есть указатель на нее)
arr[0] = m0;
arr[1] = m1;
arr[2] = m2;
//Ну и волшебный
#define COLUMN(r) arr[font[r][fontline]](); // Результат 3.7500us
//Надпомню #define COLUMN(r) SPDR=font[r][fontline]; // Выполнялся за 1.5625us
Вт окт 17, 2017 22:13:23
char OK[] PROGMEM = "OK";
Вт окт 17, 2017 22:44:23
Ср окт 18, 2017 06:53:17
мне показалось, что avr-gcc 4.9.2 и 5.2.1 выдают более компактный результат компиляции. ну а вообще максимально новая версия, которой я пользуюсь, имеет номер 6.1.1Пока_без_кота писал(а):новее, значит лучше, ага...
попробуйте такПока_без_кота писал(а):Как изменить запись, чтобы ошибка пропала ?
const __flash char OK[] = "OK";
Ср окт 18, 2017 07:48:10
const char OK[] PROGMEM = "OK";
// Отправка строки из флеша в UART =================
void SendStr_P(char *string) // На входе указатель на символ строки
{
while (pgm_read_byte(string) != '\0') // Пока байт строки не 0 (конец строки)
{
SendByte(pgm_read_byte(string)); // Мы продолжаем слать строку
string++; // Не забывая увеличивать указатель, выбирая следующий символ строки
}
}
Ср окт 18, 2017 07:55:08
да точно так же: раз указатель "на константу", то и писать его тип надо аналогичноПока_без_кота писал(а):но вот как подправить, я не знаю
void SendStr_P(const char *string)
Ср окт 18, 2017 07:58:16