Вт июн 15, 2021 07:55:17
использование static заставляет компилятор сделать загрузку 2 байт в структуру при входе в функцию и сохранение этих 2 байт при выходе, только и всего, никакой другой оптимизации он не делает. не должен делать, во всяком случае.technik-1017 писал(а):Использование static заставляет компилятор оптимизировать данный код (скорее всего он выкидывает часть)
Вт июн 15, 2021 09:59:45
Вт июн 15, 2021 10:53:55
Вт июн 15, 2021 11:57:12
как минимум в том, что в обычном случае добавление static к любой локальной переменной никаких побочных эффектов, кроме увеличения статически выделенной памяти, давать не должно, т.е. что со static, что без, поведение программы должно быть неизменным. в моём случае это не так.jcxz писал(а):А что значит "со static не работает"? В чём это выражается "не работает"?
невероятный вариант: локальная переменная потому и локальная, что более нигде не используется, хоть со static, хоть без. а всякие "опасные" действия (с указателями) у меня отсутствуют в коде.jcxz писал(а):Например - когда делаете static, то в другом месте другой код, у вас эту область памяти портит. Потому и не работает. Как вариант.
для локальной static-переенной это присваивание делается один раз, по идее вы не должны были спрашивать это, это ведь азы Си. для первого входа в обработчик надо, чтобы указатель указывал на начало массива, а в ходе обработки (см. код) этот указатель сдвигается.jcxz писал(а):Например - что такое static pos_t *scr = screen; и зачем ему (static-переменной scr) на каждом входе в функцию присваивается (переменная/константа/etc.(?)) screen? Какой тут смысл делать статик если по использованию тут нужна обычная автоматическая переменная?
ну, это, наверное, сделать можно, хотя фактически получится, что состояние индикаторов будет отставать от того, что делает обработчик но вряд ли это критично... 16 тактов, я имею ввиду.jcxz писал(а):ожидания делать не после записей, а перед. А строб перенести в начало ISR. Это сразу уменьшает ожидание внутри ISR на эти самые 16 тактов.
выбирайте, я не запрещаю.jcxz писал(а):я бы выбрал другой МК
так о том и речь: когда эта переменная БЕЗ static, т.е. содержит мусор на входе в функцию, все работает, а когда я делаю её static, т.е. она на первом входе уже инициализирована нулями - работать перестаёт...technik-1017 писал(а):переменная regs вроде должна быть (задумано) как static ну и также не инициализирована
Вт июн 15, 2021 13:12:39
Вт июн 15, 2021 13:31:18
static pos_t *scr = screen;
Вт июн 15, 2021 13:37:33
Вт июн 15, 2021 13:45:21
как минимум в томjcxz писал(а):А что значит "со static не работает"? В чём это выражается "не работает"?
И что что "не используется"? Она в памяти присутствует? Рядом с ней другие переменные (static или глобальные) присутствуют? А раз присутствуют, значит любая неправильная операция с памятью может её порушить.ARV писал(а):невероятный вариант: локальная переменная потому и локальная, что более нигде не используется, хоть со static, хоть без.jcxz писал(а):Например - когда делаете static, то в другом месте другой код, у вас эту область памяти портит. Потому и не работает. Как вариант.
Ну да, а ещё вы пишете абсолютно безглючный код, который никогда не глючит. Зачем тогда вопрос задали раз у вас ничего не глючит?ARV писал(а):а всякие "опасные" действия (с указателями) у меня отсутствуют в коде.
А вам по идее с этого места надо взять учебник по си и начать изучать азы. Ибо смотрим в листинг (IAR):ARV писал(а):для локальной static-переенной это присваивание делается один раз, по идее вы не должны были спрашивать это, это ведь азы Си.
inline void CpuUseTimeTick()
{
_Z14CpuUseTimeTickv: (+1)
...
//static u16 t = cpuUseCalc;
0x4821 LDR.N R0,??CpuUseTimeTick_0+0x8
0x78C0 LDRB R0,[R0, #+3]
0x8020 STRH R0,[R4, #+0]
...
static pos_t *scr = screen;
Вт июн 15, 2021 14:18:01
Вт июн 15, 2021 15:31:53
inline void CpuUseTimeTick()
{
_Z14CpuUseTimeTickv: (+1)
...
//static u16 t = cpuUseCalc;
0x4821 LDR.N R0,??CpuUseTimeTick_0+0x8
0x78C0 LDRB R0,[R0, #+3]
0x8020 STRH R0,[R4, #+0]
...
Вт июн 15, 2021 16:05:02
почему? screen - это массив, он не static, но адрес-то его неизменен, и присваивание его указателю, по-моему, совершенно безопасно.WiseLord писал(а):действительно опаснее, чем выглядит
у меня atmega328 и в коде статически задействовано 63 байта ОЗУ - там еще немеряно памяти! никаких наездов нет и быть не может.WiseLord писал(а):ОЗУ уже не хватает и стек наезжает на область статических переменных..
я не могу сказать точнее, чем сформулировал ранее: добавление static к локальной переменной ломать код не должно по определению. поэтому "не работает" выражается в том, что работа кода ломается. а эффекты от этого могут быть разные - от нарушения индикации (одновременное свечение соседних разрядов) до полной абракадабры индикации (хаотические мерцания, скакания цифр и их яркости).jcxz писал(а):Перечитайте ещё раз
теоретически - да, но на практике - откуда взяться неправильной операции с памятью?! memcpy и strcpy я не использую, как не использую и аналогичных "самописных" функций, заполняющих/изменяющих области памяти по указателю... других способов разрушить "соседние" переменные (не считая переполнения стека) я не знаю... а стек не переполняется - см. вышеjcxz писал(а):А раз присутствуют, значит любая неправильная операция с памятью может её порушить.
сам по себе код не глючит, это я где-то что-то сделал не так. только я не могу понять, что именно не так.jcxz писал(а):вы пишете абсолютно безглючный код, который никогда не глючит
может быть, я и не знаю... но вот предыдущие 10 лет программирования как-то static-ом для локальных переменных пользовался, и ни разу проблем не испытывал, а тут вот оно чо... азы поменялись? а что делает IAR - я не в курсе, мне сейчас больше интересно, что avr-gcc делает. по листингам он делает все правильно, т.е. static-и сохраняет/загружает, auto-переменные не инициализирует никак... и, как ранее было сказано, для не-static варианта на 64-ю итерацию прерывания все устаканивается, а со static - нет. вот в чем вопрос.jcxz писал(а):Или думаете это IAR не знает азов си? Или всё-таки вы их не знаете?
это можно, хотя поможет навряд ли.jcxz писал(а):Я ещё в самом начале советовал автору привести определения всех объектов и типов, фигурирующих в примере кода. Чтобы не играть в угадайку.
static const __flash uint16_t digs[CHAR_CNT] = {
CHAR_0, CHAR_1, CHAR_2, CHAR_3, CHAR_4,
CHAR_5, CHAR_6, CHAR_7, CHAR_8, CHAR_9,
CHAR_PU, CHAR_PD, CHAR_PB, CHAR_SP
};
/// структура знакоместа
typedef struct {
volatile uint8_t bright; //!< заданная яркость
volatile char_t symbol[2]; //!< коды знака
} pos_t;
// структура для управления индикаторами через регистры 74HC595
typedef union {
struct {
uint16_t symbol : 11; // код символа
uint8_t anode : POS_CNT; // бит разряда
};
uint8_t bytes[2]; // 2 байта для выдачи в регистры
uint16_t word;
} regs_t;
pos_t screen[POS_CNT];
///*
ISR(TIMER1_OVF_vect){
static uint8_t entry;
static uint8_t anode = 0x08;
uint16_t word;
static pos_t *scr = screen;
word = digs[scr->symbol[entry >= scr->bright]];
if(entry < 50)
word |= anode << 8;
if(++entry >= IND_RPT){
entry = 0;
two_ms++;
scr++;
anode <<= 1;
if(anode == 0){
anode = 0x08;
scr = screen;
}
}
SPDR = word >> 8;
while(bit_is_clear(SPSR, SPIF));
SPDR = word;
while(bit_is_clear(SPSR, SPIF));
// строб для защелкивания данных
PORTB |= LOAD_PIN;
PORTB &= ~LOAD_PIN;
}
Вт июн 15, 2021 16:38:20
Вт июн 15, 2021 16:52:07
Вт июн 15, 2021 16:58:50
Вт июн 15, 2021 17:01:26
гарантия есть: всего 10 символов для цифр, 3 варианта для точек и 1 "пустой" символ - итого 14.WiseLord писал(а):CHAR_CNT неизвестна, но есть ли гарантия, что где-то в scr->symbol[0] или scr->symbol[1] не лежит число большее либо равно этому?
Вт июн 15, 2021 17:02:56
word = digs[scr->symbol[entry >= scr->bright]];
word = digs[scr->symbol[0]];
word = digs[scr->symbol[1]];
Вт июн 15, 2021 17:12:18
переменная scr->symbol[i] 8-битная, см. структуру pos_t. содержит эта переменная код символов от 0 до 13. коды эти получаются самописной функцией, аналогичной itoa по смыслу. а вот digs[] - это уже массив 11-битных переменныхWiseLord писал(а):scr->symbol[i] - это какая-то 11-битная переменная, например, 0x0482 = .1154
Вопрос, насколько правомерно тогда digs[1154] ?
Вт июн 15, 2021 17:18:26
#include <stdio.h>
#include <stdint.h>
#define CHAR_CNT 14
#define POS_CNT 5
#define IND_RPT 63
#define CHAR_0 0x000
#define CHAR_1 0x111
#define CHAR_2 0x222
#define CHAR_3 0x333
#define CHAR_4 0x444
#define CHAR_5 0x555
#define CHAR_6 0x666
#define CHAR_7 0x777
#define CHAR_8 0x888
#define CHAR_9 0x999
#define CHAR_PU 0xaaa
#define CHAR_PD 0xbbb
#define CHAR_PB 0xccc
#define CHAR_SP 0xddd
static const uint16_t digs[CHAR_CNT] = {
CHAR_0, CHAR_1, CHAR_2, CHAR_3, CHAR_4,
CHAR_5, CHAR_6, CHAR_7, CHAR_8, CHAR_9,
CHAR_PU, CHAR_PD, CHAR_PB, CHAR_SP
};
/// структура знакоместа
typedef struct {
volatile uint8_t bright; //!< заданная яркость
volatile char symbol[2]; //!< коды знака
} pos_t;
// структура для управления индикаторами через регистры 74HC595
typedef union {
struct {
uint16_t symbol : 11; // код символа
uint8_t anode : POS_CNT; // бит разряда
};
uint8_t bytes[2]; // 2 байта для выдачи в регистры
uint16_t word;
} regs_t;
pos_t screen[POS_CNT];
void ISR(){
static uint8_t entry;
static uint8_t anode = 0x08;
uint16_t word;
static pos_t *scr = screen;
word = digs[scr->symbol[entry >= scr->bright]];
if(entry < 50)
word |= anode << 8;
if(++entry >= IND_RPT){
entry = 0;
scr++;
anode <<= 1;
if(anode == 0){
anode = 0x08;
scr = screen;
}
}
printf("entry=%2d: word=%04x\n", entry, word);
}
int main()
{
screen[0].symbol[0] = 1;
screen[0].symbol[1] = 2;
screen[0].bright = 4;
screen[1].symbol[0] = 3;
screen[1].symbol[1] = 4;
screen[1].bright = 3;
screen[2].symbol[0] = 5;
screen[2].symbol[1] = 6;
screen[2].bright = 2;
screen[3].symbol[0] = 7;
screen[3].symbol[1] = 8;
screen[3].bright = 1;
screen[4].symbol[0] = 9;
screen[4].symbol[1] = 10;
screen[4].bright = 2;
for (int i = 0; i < 1000; i++) {
ISR();
}
return 0;
}
entry= 1: word=0911
entry= 2: word=0911
entry= 3: word=0911
entry= 4: word=0911
entry= 5: word=0a22
entry= 6: word=0a22
entry= 7: word=0a22
entry= 8: word=0a22
entry= 9: word=0a22
entry=10: word=0a22
entry=11: word=0a22
entry=12: word=0a22
entry=13: word=0a22
entry=14: word=0a22
entry=15: word=0a22
entry=16: word=0a22
entry=17: word=0a22
entry=18: word=0a22
entry=19: word=0a22
entry=20: word=0a22
entry=21: word=0a22
entry=22: word=0a22
entry=23: word=0a22
entry=24: word=0a22
entry=25: word=0a22
entry=26: word=0a22
entry=27: word=0a22
entry=28: word=0a22
entry=29: word=0a22
entry=30: word=0a22
entry=31: word=0a22
entry=32: word=0a22
entry=33: word=0a22
entry=34: word=0a22
entry=35: word=0a22
entry=36: word=0a22
entry=37: word=0a22
entry=38: word=0a22
entry=39: word=0a22
entry=40: word=0a22
entry=41: word=0a22
entry=42: word=0a22
entry=43: word=0a22
entry=44: word=0a22
entry=45: word=0a22
entry=46: word=0a22
entry=47: word=0a22
entry=48: word=0a22
entry=49: word=0a22
entry=50: word=0a22
entry=51: word=0222
entry=52: word=0222
entry=53: word=0222
entry=54: word=0222
entry=55: word=0222
entry=56: word=0222
entry=57: word=0222
entry=58: word=0222
entry=59: word=0222
entry=60: word=0222
entry=61: word=0222
entry=62: word=0222
entry= 0: word=0222
entry= 1: word=1333
entry= 2: word=1333
entry= 3: word=1333
entry= 4: word=1444
entry= 5: word=1444
entry= 6: word=1444
entry= 7: word=1444
entry= 8: word=1444
entry= 9: word=1444
entry=10: word=1444
entry=11: word=1444
entry=12: word=1444
entry=13: word=1444
entry=14: word=1444
entry=15: word=1444
entry=16: word=1444
entry=17: word=1444
entry=18: word=1444
entry=19: word=1444
entry=20: word=1444
entry=21: word=1444
entry=22: word=1444
entry=23: word=1444
entry=24: word=1444
entry=25: word=1444
entry=26: word=1444
entry=27: word=1444
entry=28: word=1444
entry=29: word=1444
entry=30: word=1444
entry=31: word=1444
entry=32: word=1444
entry=33: word=1444
entry=34: word=1444
entry=35: word=1444
entry=36: word=1444
entry=37: word=1444
entry=38: word=1444
entry=39: word=1444
entry=40: word=1444
entry=41: word=1444
entry=42: word=1444
entry=43: word=1444
entry=44: word=1444
entry=45: word=1444
entry=46: word=1444
entry=47: word=1444
entry=48: word=1444
entry=49: word=1444
entry=50: word=1444
entry=51: word=0444
entry=52: word=0444
entry=53: word=0444
entry=54: word=0444
entry=55: word=0444
entry=56: word=0444
entry=57: word=0444
entry=58: word=0444
entry=59: word=0444
entry=60: word=0444
entry=61: word=0444
entry=62: word=0444
entry= 0: word=0444
entry= 1: word=2555
entry= 2: word=2555
entry= 3: word=2666
entry= 4: word=2666
entry= 5: word=2666
entry= 6: word=2666
entry= 7: word=2666
entry= 8: word=2666
entry= 9: word=2666
entry=10: word=2666
entry=11: word=2666
entry=12: word=2666
entry=13: word=2666
entry=14: word=2666
entry=15: word=2666
entry=16: word=2666
entry=17: word=2666
entry=18: word=2666
entry=19: word=2666
entry=20: word=2666
entry=21: word=2666
entry=22: word=2666
entry=23: word=2666
entry=24: word=2666
entry=25: word=2666
entry=26: word=2666
entry=27: word=2666
entry=28: word=2666
entry=29: word=2666
entry=30: word=2666
entry=31: word=2666
entry=32: word=2666
entry=33: word=2666
entry=34: word=2666
entry=35: word=2666
entry=36: word=2666
entry=37: word=2666
entry=38: word=2666
entry=39: word=2666
entry=40: word=2666
entry=41: word=2666
entry=42: word=2666
entry=43: word=2666
entry=44: word=2666
entry=45: word=2666
entry=46: word=2666
entry=47: word=2666
entry=48: word=2666
entry=49: word=2666
entry=50: word=2666
entry=51: word=0666
entry=52: word=0666
entry=53: word=0666
entry=54: word=0666
entry=55: word=0666
entry=56: word=0666
entry=57: word=0666
entry=58: word=0666
entry=59: word=0666
entry=60: word=0666
entry=61: word=0666
entry=62: word=0666
entry= 0: word=0666
entry= 1: word=4777
entry= 2: word=4888
entry= 3: word=4888
entry= 4: word=4888
entry= 5: word=4888
entry= 6: word=4888
entry= 7: word=4888
entry= 8: word=4888
entry= 9: word=4888
entry=10: word=4888
entry=11: word=4888
entry=12: word=4888
entry=13: word=4888
entry=14: word=4888
entry=15: word=4888
entry=16: word=4888
entry=17: word=4888
entry=18: word=4888
entry=19: word=4888
entry=20: word=4888
entry=21: word=4888
entry=22: word=4888
entry=23: word=4888
entry=24: word=4888
entry=25: word=4888
entry=26: word=4888
entry=27: word=4888
entry=28: word=4888
entry=29: word=4888
entry=30: word=4888
entry=31: word=4888
entry=32: word=4888
entry=33: word=4888
entry=34: word=4888
entry=35: word=4888
entry=36: word=4888
entry=37: word=4888
entry=38: word=4888
entry=39: word=4888
entry=40: word=4888
entry=41: word=4888
entry=42: word=4888
entry=43: word=4888
entry=44: word=4888
entry=45: word=4888
entry=46: word=4888
entry=47: word=4888
entry=48: word=4888
entry=49: word=4888
entry=50: word=4888
entry=51: word=0888
entry=52: word=0888
entry=53: word=0888
entry=54: word=0888
entry=55: word=0888
entry=56: word=0888
entry=57: word=0888
entry=58: word=0888
entry=59: word=0888
entry=60: word=0888
entry=61: word=0888
entry=62: word=0888
entry= 0: word=0888
entry= 1: word=8999
entry= 2: word=8999
entry= 3: word=8aaa
entry= 4: word=8aaa
entry= 5: word=8aaa
entry= 6: word=8aaa
entry= 7: word=8aaa
entry= 8: word=8aaa
entry= 9: word=8aaa
entry=10: word=8aaa
entry=11: word=8aaa
entry=12: word=8aaa
entry=13: word=8aaa
entry=14: word=8aaa
entry=15: word=8aaa
entry=16: word=8aaa
entry=17: word=8aaa
entry=18: word=8aaa
entry=19: word=8aaa
entry=20: word=8aaa
entry=21: word=8aaa
entry=22: word=8aaa
entry=23: word=8aaa
entry=24: word=8aaa
entry=25: word=8aaa
entry=26: word=8aaa
entry=27: word=8aaa
entry=28: word=8aaa
entry=29: word=8aaa
entry=30: word=8aaa
entry=31: word=8aaa
entry=32: word=8aaa
entry=33: word=8aaa
entry=34: word=8aaa
entry=35: word=8aaa
entry=36: word=8aaa
entry=37: word=8aaa
entry=38: word=8aaa
entry=39: word=8aaa
entry=40: word=8aaa
entry=41: word=8aaa
entry=42: word=8aaa
entry=43: word=8aaa
entry=44: word=8aaa
entry=45: word=8aaa
entry=46: word=8aaa
entry=47: word=8aaa
entry=48: word=8aaa
entry=49: word=8aaa
entry=50: word=8aaa
entry=51: word=0aaa
entry=52: word=0aaa
entry=53: word=0aaa
entry=54: word=0aaa
entry=55: word=0aaa
entry=56: word=0aaa
entry=57: word=0aaa
entry=58: word=0aaa
entry=59: word=0aaa
entry=60: word=0aaa
entry=61: word=0aaa
entry=62: word=0aaa
entry= 0: word=0aaa
entry= 1: word=0911
entry= 2: word=0911
entry= 3: word=0911
entry= 4: word=0911
entry= 5: word=0a22
entry= 6: word=0a22
entry= 7: word=0a22
entry= 8: word=0a22
entry= 9: word=0a22
entry=10: word=0a22
entry=11: word=0a22
Вт июн 15, 2021 17:21:49
Вт авг 17, 2021 08:39:00