Исправить TESTLAMP, запуск CAN и расчёт фазных токов

Сохранить состояние TESTLAMP при кратких провалах входа и исключить повторный вход Timer1 во время передачи индикации.
Явно сбрасывать служебный обмен CAN при запуске и выбирать соседнюю фазу по локальному индексу канала АЦП.
Сохранить текущую последовательность DATA/CLK и проверочные варианты таймингов, добавить поведенческие тесты и обновить образ прошивки с картой памяти.
This commit is contained in:
2026-10-13 14:13:43 +03:00
parent fa20ed085b
commit 04a9d989fb
18 changed files with 1983 additions and 655 deletions

View File

@@ -0,0 +1,358 @@
/* Последовательный вывод данных канала индикации. Русские пояснения сохранены в UTF-8. */
/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */
#include "DSP2833x_Device.h" // DSP281x Headerfile Include File
/* Подключает "DSP2833x_SWPrioritizedIsrLevels.h": поставляемое TI описание SWPrioritizedIsrLevels для семейства C2833x. */
#include "DSP2833x_SWPrioritizedIsrLevels.h"
/* Подключает "filter_bat2.h": накопительный фильтр измерительных каналов. */
#include "filter_bat2.h"
/* Подключает "measure.h": обработка датчиков, вычисление величин и миллисекундный такт системы. */
#include "measure.h"
/* Подключает "RS485.h": приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
#include "RS485.h"
/* Подключает "message.h": обработка Modbus, заводские параметры и сохранение настроек. */
#include "message.h"
/* Подключает "kanal.h": последовательный вывод данных канала индикации. */
#include "kanal.h"
/* Подключает "pulto.h": обмен и индикация пульта. */
#include "pulto.h"
/* Подключает "package.h": адреса устройств, типы плат и псевдонимы технологических регистров. */
#include "package.h"
/* Подключает "tools.h": настройка внешней памяти и служебные задержки. */
#include "tools.h"
/* Подключает "peripher.h": перемычки режима платы, дискретные входы и выходы. */
#include "peripher.h"
/* Объявляет digits — данные digits. Начальное значение задаётся справа от знака равенства. */
int digits[16] = {63,6,91,79,102,109,125,7,127,111,64,0,0,0,121,0};
/* Объявляет readr — данные readr. Начальное значение задаётся справа от знака равенства. */
int readr[5] = {0x08,0x0C,0x10,0x00,0x04};
/* Ограничивает настройки таймингов компилятором TI C2000; модель на ПК не использует эти директивы. */
#if defined(__TI_COMPILER_VERSION__)
/* Сохраняет отдельный вызов переключения CLOCK: встраивание при -O3 сокращало удержание DATA после фронта. */
#pragma FUNC_CANNOT_INLINE(DCLK)
/* Возвращает генерацию DCLK как в образе от 06.10.2026: уровень 1 и приоритет скорости 3 сохраняют прежнюю последовательность инструкций GPIO. */
#pragma FUNCTION_OPTIONS(DCLK, "--opt_level=1 --opt_for_speed=3")
/* Сохраняет отдельный вызов переключения DATA, чтобы длительность импульсов не зависела от встраивания в передатчик. */
#pragma FUNC_CANNOT_INLINE(DOUT)
/* Возвращает генерацию DOUT с прежними параметрами -O1 и --opt_for_speed=3; значения взяты из старой конфигурации CCS. */
#pragma FUNCTION_OPTIONS(DOUT, "--opt_level=1 --opt_for_speed=3")
/* Не позволяет встроить разделитель пакетов в цикл передачи и изменить интервалы между переключениями линий. */
#pragma FUNC_CANNOT_INLINE(RESET)
/* Сохраняет прежнюю последовательность вызовов GPIO и задержек разделителя, используя настройки старого образа. */
#pragma FUNCTION_OPTIONS(RESET, "--opt_level=1 --opt_for_speed=3")
/* Сохраняет отдельный вызов передачи бита; протокол использует порядок и интервалы фронтов CLOCK и DATA. */
#pragma FUNC_CANNOT_INLINE(SENDBIT)
/* Возвращает передаче бита настройки старого образа -O1 и --opt_for_speed=3, оставляя остальной проект на -O3. */
#pragma FUNCTION_OPTIONS(SENDBIT, "--opt_level=1 --opt_for_speed=3")
/* Завершает блок настроек TI, не изменяя формат пакетов и существующие счётчики задержек. */
#endif
/* Начинает функцию DCLK; назначение модуля — последовательный вывод данных канала индикации. */
void DCLK(int x)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(x) GpioDataRegs.GPASET.bit.GPIO6=1; последующий оператор выполняется только при истинном условии. */
if(x) GpioDataRegs.GPASET.bit.GPIO6=1;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else GpioDataRegs.GPACLEAR.bit.GPIO6=1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию DOUT; назначение модуля — последовательный вывод данных канала индикации. */
void DOUT(int x)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(x) GpioDataRegs.GPASET.bit.GPIO8=1; последующий оператор выполняется только при истинном условии. */
if(x) GpioDataRegs.GPASET.bit.GPIO8=1;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else GpioDataRegs.GPACLEAR.bit.GPIO8=1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Условие компиляции CLKMULT==1: выбранный блок включается в текущий вариант прошивки. */
#if CLKMULT==1
/* Задаёт POWS0 = 0L; данные POWS0. */
#define POWS0 0L
/* Задаёт POWS1 = 10L; данные POWS1. */
#define POWS1 10L
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции CLKMULT==2: выбранный блок включается в текущий вариант прошивки. */
#if CLKMULT==2
/* Задаёт POWS0 = 0L; данные POWS0. */
#define POWS0 0L
/* Задаёт POWS1 = 30L; данные POWS1. */
#define POWS1 30L
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции CLKMULT==3: выбранный блок включается в текущий вариант прошивки. */
#if CLKMULT==3
/* Задаёт POWS0 = 1L; данные POWS0. */
#define POWS0 1L
/* Задаёт POWS1 = 50L; данные POWS1. */
#define POWS1 50L
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции CLKMULT==4: выбранный блок включается в текущий вариант прошивки. */
#if CLKMULT==4
/* Задаёт POWS0 = 2L; данные POWS0. */
#define POWS0 2L
/* Задаёт POWS1 = 60L; данные POWS1. */
#define POWS1 60L
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции CLKMULT==5: выбранный блок включается в текущий вариант прошивки. */
#if CLKMULT==5
/* Задаёт POWS0 = 4L; данные POWS0. */
#define POWS0 4L
/* Задаёт POWS1 = 80L; данные POWS1. */
#define POWS1 80L
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Начинает функцию RESET; назначение модуля — последовательный вывод данных канала индикации. */
void RESET()
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Вызывает DCLK с аргументами (0) в текущей последовательности операций. */
DCLK(0);
/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */
#if POWS1>0
/* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */
DSP28x_usDelay(POWS1);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Вызывает DOUT с аргументами (1) в текущей последовательности операций. */
DOUT(1);
/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */
#if POWS1>0
/* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */
DSP28x_usDelay(POWS1);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Вызывает DOUT с аргументами (0) в текущей последовательности операций. */
DOUT(0);
/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */
#if POWS1>0
/* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */
DSP28x_usDelay(POWS1);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию SENDBIT; назначение модуля — последовательный вывод данных канала индикации. */
void SENDBIT(int x)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Выставляет передаваемый бит DATA до подъёма CLOCK, сохраняя его на протяжении высокого уровня такта. */
DOUT(x); DCLK(1);
/* Условие компиляции POWS0>0: выбранный блок включается в текущий вариант прошивки. */
#if POWS0>0
/* Вызывает DSP28x_usDelay с аргументами (POWS0) в текущей последовательности операций. */
DSP28x_usDelay(POWS0);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Вариант A: задержка перед спадом CLOCK продлевает высокий уровень при действительном DATA; POWS0+1 — прежний счётчик циклов TI, не микросекунды. */
DSP28x_usDelay(POWS0+1);
/* Опускает CLOCK при ещё действительном DATA, чтобы сохранить передаваемый бит на отрицательном фронте такта. */
DCLK(0);
/* Сбрасывает DATA после спада CLOCK; в варианте A дополнительной задержки между спадом и сбросом нет. */
DOUT(0);
/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */
#if POWS1>0
/* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */
DSP28x_usDelay(POWS1);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию kanal_Send; назначение модуля — последовательный вывод данных канала индикации. */
void kanal_Send(int adr, long dat, int dot)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет Word — слово; data — данные; aliq_part — данные aliq_part; dg — данные dg. */
long Word,data,aliq_part,dg[4];
/* Объявляет i — данные i; j — данные j; bit — представление регистра отдельными битовыми полями; byt — данные byt; addr — данные addr. Начальное значение задаётся справа от знака равенства. */
int i,j,bit,byt,addr,sgn=0,punkt=0,aliq_len=0,full_len, isdot=0;
/* Проверяет if(adr>1); последующий оператор выполняется только при истинном условии. */
if(adr>1) // Лампочки
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает Word значением dat; слово. */
Word =dat;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(dat<0) sgn=1; последующий оператор выполняется только при истинном условии. */
if(dat<0) sgn=1;
/* Записывает data значением labs(dat); данные. */
data = labs(dat);
/* Проверяет if(dot>=0 и dot<4) isdot = 1; последующий оператор выполняется только при истинном условии. */
if(dot>=0 && dot<4) isdot = 1;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else dot=0;
/* Записывает aliq_part значением data; данные aliq_part. */
aliq_part = data;
/* Цикл for(i=0;i<dot;i++) aliq_part/=10;; задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<dot;i++) aliq_part/=10;
/* Записывает dat значением aliq_part; данные dat. */
dat = aliq_part;
/* Повторяет или ожидает, пока выполняется while(dat>0). */
while(dat>0)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Делит dat значением 10; данные dat. */
aliq_len++; dat/=10;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает dat значением data; данные dat. */
dat = data;
/* Записывает full_len значением aliq_len+sgn; данные full_len. */
full_len = aliq_len+sgn;
/* Проверяет if(full_len==0) full_len=1; последующий оператор выполняется только при истинном условии. */
if(full_len==0) full_len=1;
/* Увеличивает full_len значением dot; данные full_len. */
full_len += dot;
/* Цикл for(i=0; i<(full_len-4);i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0; i<(full_len-4);i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Начинает цикл с проверкой условия после тела: первый проход выполняется всегда. */
dot--; dat/=10;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(dot<0) dot=0; последующий оператор выполняется только при истинном условии. */
if(dot<0) dot=0;
/* Записывает punkt значением 1<<dot; данные punkt. */
punkt = 1<<dot;
/* Проверяет if(punkt==1) punkt=0; последующий оператор выполняется только при истинном условии. */
if(punkt==1) punkt=0;
/* Записывает dg[3] значением (dat)/1000; данные dg. */
dg[3] = (dat)/1000;
/* Записывает dg[2] значением (dat%1000)/100; данные dg. */
dg[2] = (dat%1000)/100;
/* Записывает dg[1] значением (dat%100)/10; данные dg. */
dg[1] = (dat%100)/10;
/* Записывает dg[0] значением (dat%10); данные dg. */
dg[0] = (dat%10);
/* Проверяет if(dg[0]+dg[1]+dg[2]+dg[3]==0); последующий оператор выполняется только при истинном условии. */
if(dg[0]+dg[1]+dg[2]+dg[3]==0)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает punkt значением 0; dot=0; sgn=0; данные punkt. */
punkt=0; dot=0; sgn=0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(isdot); последующий оператор выполняется только при истинном условии. */
if(isdot)
/* Цикл for(i=3;i>0;i--); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=3;i>0;i--)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if((dg[i]==0) и (i!=dot)); последующий оператор выполняется только при истинном условии. */
if((dg[i]==0)&&(i!=dot))
/* Записывает dg[i] значением 0xF; данные dg. */
dg[i]=0xF; // Это значит пусто
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else break;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(sgn); последующий оператор выполняется только при истинном условии. */
if(sgn)
/* Цикл for(i=1;i<4;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=1;i<4;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if( (dg[i]==0xF) или (i==3)); последующий оператор выполняется только при истинном условии. */
if( (dg[i]==0xF)||(i==3))
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает dg[i] значением 0xA; данные dg. */
dg[i]=0xA; // Это значит минус
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
/* Цикл for(i=0;i<4;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<4;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает dg[i] значением digits[dg[i]]; данные dg. */
dg[i] = digits[dg[i]];
/* Проверяет if((punkt>>i)&1) dg[i]+= 128; последующий оператор выполняется только при истинном условии. */
if((punkt>>i)&1) dg[i]+= 128;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает Word значением ((dg[0] ) & 0x000000FF) | ((dg[1]<<8 ) & 0x0000FF00) |; слово. */
Word = ((dg[0] ) & 0x000000FF) | ((dg[1]<<8 ) & 0x0000FF00) |
/* Продолжает список аргументов, полей или выражение ((dg[2]<<16) & 0x00FF0000) | ((dg[3]<<24) & 0xFF000000);; порядок элементов сохраняется. */
((dg[2]<<16) & 0x00FF0000) | ((dg[3]<<24) & 0xFF000000);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает addr значением readr[adr]; данные addr. */
addr = readr[adr];
/* Цикл for (i=0;i<4;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for (i=0;i<4;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(addr>0x10) break; последующий оператор выполняется только при истинном условии. */
if(addr>0x10) break;
/* Цикл for (j=0;j<8;j++); задаёт начальное значение, условие продолжения и шаг перебора. */
for (j=0;j<8;j++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает bit значением Word & 1; Word >>= 1; представление регистра отдельными битовыми полями. */
bit = Word & 1; Word >>= 1;
/* Вызывает SENDBIT с аргументами (bit) в текущей последовательности операций. */
SENDBIT(bit);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает byt значением addr; данные byt. */
byt = addr;
/* Цикл for (j=0;j<6;j++); задаёт начальное значение, условие продолжения и шаг перебора. */
for (j=0;j<6;j++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает bit значением byt & 1; byt >>= 1; представление регистра отдельными битовыми полями. */
bit = byt & 1; byt >>= 1;
/* Вызывает SENDBIT с аргументами (bit) в текущей последовательности операций. */
SENDBIT(bit);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Изменяет счётчик в выражении addr++; на один для следующего шага. */
addr++;
/* Вызывает RESET с аргументами () в текущей последовательности операций. */
RESET();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}

View File

@@ -0,0 +1,358 @@
/* Последовательный вывод данных канала индикации. Русские пояснения сохранены в UTF-8. */
/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */
#include "DSP2833x_Device.h" // DSP281x Headerfile Include File
/* Подключает "DSP2833x_SWPrioritizedIsrLevels.h": поставляемое TI описание SWPrioritizedIsrLevels для семейства C2833x. */
#include "DSP2833x_SWPrioritizedIsrLevels.h"
/* Подключает "filter_bat2.h": накопительный фильтр измерительных каналов. */
#include "filter_bat2.h"
/* Подключает "measure.h": обработка датчиков, вычисление величин и миллисекундный такт системы. */
#include "measure.h"
/* Подключает "RS485.h": приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
#include "RS485.h"
/* Подключает "message.h": обработка Modbus, заводские параметры и сохранение настроек. */
#include "message.h"
/* Подключает "kanal.h": последовательный вывод данных канала индикации. */
#include "kanal.h"
/* Подключает "pulto.h": обмен и индикация пульта. */
#include "pulto.h"
/* Подключает "package.h": адреса устройств, типы плат и псевдонимы технологических регистров. */
#include "package.h"
/* Подключает "tools.h": настройка внешней памяти и служебные задержки. */
#include "tools.h"
/* Подключает "peripher.h": перемычки режима платы, дискретные входы и выходы. */
#include "peripher.h"
/* Объявляет digits — данные digits. Начальное значение задаётся справа от знака равенства. */
int digits[16] = {63,6,91,79,102,109,125,7,127,111,64,0,0,0,121,0};
/* Объявляет readr — данные readr. Начальное значение задаётся справа от знака равенства. */
int readr[5] = {0x08,0x0C,0x10,0x00,0x04};
/* Ограничивает настройки таймингов компилятором TI C2000; модель на ПК не использует эти директивы. */
#if defined(__TI_COMPILER_VERSION__)
/* Сохраняет отдельный вызов переключения CLOCK: встраивание при -O3 сокращало удержание DATA после фронта. */
#pragma FUNC_CANNOT_INLINE(DCLK)
/* Возвращает генерацию DCLK как в образе от 06.10.2026: уровень 1 и приоритет скорости 3 сохраняют прежнюю последовательность инструкций GPIO. */
#pragma FUNCTION_OPTIONS(DCLK, "--opt_level=1 --opt_for_speed=3")
/* Сохраняет отдельный вызов переключения DATA, чтобы длительность импульсов не зависела от встраивания в передатчик. */
#pragma FUNC_CANNOT_INLINE(DOUT)
/* Возвращает генерацию DOUT с прежними параметрами -O1 и --opt_for_speed=3; значения взяты из старой конфигурации CCS. */
#pragma FUNCTION_OPTIONS(DOUT, "--opt_level=1 --opt_for_speed=3")
/* Не позволяет встроить разделитель пакетов в цикл передачи и изменить интервалы между переключениями линий. */
#pragma FUNC_CANNOT_INLINE(RESET)
/* Сохраняет прежнюю последовательность вызовов GPIO и задержек разделителя, используя настройки старого образа. */
#pragma FUNCTION_OPTIONS(RESET, "--opt_level=1 --opt_for_speed=3")
/* Сохраняет отдельный вызов передачи бита; протокол использует порядок и интервалы фронтов CLOCK и DATA. */
#pragma FUNC_CANNOT_INLINE(SENDBIT)
/* Возвращает передаче бита настройки старого образа -O1 и --opt_for_speed=3, оставляя остальной проект на -O3. */
#pragma FUNCTION_OPTIONS(SENDBIT, "--opt_level=1 --opt_for_speed=3")
/* Завершает блок настроек TI, не изменяя формат пакетов и существующие счётчики задержек. */
#endif
/* Начинает функцию DCLK; назначение модуля — последовательный вывод данных канала индикации. */
void DCLK(int x)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(x) GpioDataRegs.GPASET.bit.GPIO6=1; последующий оператор выполняется только при истинном условии. */
if(x) GpioDataRegs.GPASET.bit.GPIO6=1;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else GpioDataRegs.GPACLEAR.bit.GPIO6=1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию DOUT; назначение модуля — последовательный вывод данных канала индикации. */
void DOUT(int x)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(x) GpioDataRegs.GPASET.bit.GPIO8=1; последующий оператор выполняется только при истинном условии. */
if(x) GpioDataRegs.GPASET.bit.GPIO8=1;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else GpioDataRegs.GPACLEAR.bit.GPIO8=1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Условие компиляции CLKMULT==1: выбранный блок включается в текущий вариант прошивки. */
#if CLKMULT==1
/* Задаёт POWS0 = 0L; данные POWS0. */
#define POWS0 0L
/* Задаёт POWS1 = 10L; данные POWS1. */
#define POWS1 10L
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции CLKMULT==2: выбранный блок включается в текущий вариант прошивки. */
#if CLKMULT==2
/* Задаёт POWS0 = 0L; данные POWS0. */
#define POWS0 0L
/* Задаёт POWS1 = 30L; данные POWS1. */
#define POWS1 30L
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции CLKMULT==3: выбранный блок включается в текущий вариант прошивки. */
#if CLKMULT==3
/* Задаёт POWS0 = 1L; данные POWS0. */
#define POWS0 1L
/* Задаёт POWS1 = 50L; данные POWS1. */
#define POWS1 50L
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции CLKMULT==4: выбранный блок включается в текущий вариант прошивки. */
#if CLKMULT==4
/* Задаёт POWS0 = 2L; данные POWS0. */
#define POWS0 2L
/* Задаёт POWS1 = 60L; данные POWS1. */
#define POWS1 60L
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции CLKMULT==5: выбранный блок включается в текущий вариант прошивки. */
#if CLKMULT==5
/* Задаёт POWS0 = 4L; данные POWS0. */
#define POWS0 4L
/* Задаёт POWS1 = 80L; данные POWS1. */
#define POWS1 80L
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Начинает функцию RESET; назначение модуля — последовательный вывод данных канала индикации. */
void RESET()
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Вызывает DCLK с аргументами (0) в текущей последовательности операций. */
DCLK(0);
/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */
#if POWS1>0
/* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */
DSP28x_usDelay(POWS1);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Вызывает DOUT с аргументами (1) в текущей последовательности операций. */
DOUT(1);
/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */
#if POWS1>0
/* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */
DSP28x_usDelay(POWS1);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Вызывает DOUT с аргументами (0) в текущей последовательности операций. */
DOUT(0);
/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */
#if POWS1>0
/* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */
DSP28x_usDelay(POWS1);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию SENDBIT; назначение модуля — последовательный вывод данных канала индикации. */
void SENDBIT(int x)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Выставляет передаваемый бит DATA до подъёма CLOCK, сохраняя его на протяжении высокого уровня такта. */
DOUT(x); DCLK(1);
/* Условие компиляции POWS0>0: выбранный блок включается в текущий вариант прошивки. */
#if POWS0>0
/* Вызывает DSP28x_usDelay с аргументами (POWS0) в текущей последовательности операций. */
DSP28x_usDelay(POWS0);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Опускает CLOCK при ещё действительном DATA, чтобы сохранить передаваемый бит на отрицательном фронте такта. */
DCLK(0);
/* Вариант B: задержка между DCLK(0) и DOUT(0) удерживает DATA после спада CLOCK; POWS0+1 — прежний счётчик циклов TI, не микросекунды. */
DSP28x_usDelay(POWS0+1);
/* Сбрасывает DATA после завершения паузы удержания, возвращая линию к нулю перед следующим битом. */
DOUT(0);
/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */
#if POWS1>0
/* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */
DSP28x_usDelay(POWS1);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию kanal_Send; назначение модуля — последовательный вывод данных канала индикации. */
void kanal_Send(int adr, long dat, int dot)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет Word — слово; data — данные; aliq_part — данные aliq_part; dg — данные dg. */
long Word,data,aliq_part,dg[4];
/* Объявляет i — данные i; j — данные j; bit — представление регистра отдельными битовыми полями; byt — данные byt; addr — данные addr. Начальное значение задаётся справа от знака равенства. */
int i,j,bit,byt,addr,sgn=0,punkt=0,aliq_len=0,full_len, isdot=0;
/* Проверяет if(adr>1); последующий оператор выполняется только при истинном условии. */
if(adr>1) // Лампочки
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает Word значением dat; слово. */
Word =dat;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(dat<0) sgn=1; последующий оператор выполняется только при истинном условии. */
if(dat<0) sgn=1;
/* Записывает data значением labs(dat); данные. */
data = labs(dat);
/* Проверяет if(dot>=0 и dot<4) isdot = 1; последующий оператор выполняется только при истинном условии. */
if(dot>=0 && dot<4) isdot = 1;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else dot=0;
/* Записывает aliq_part значением data; данные aliq_part. */
aliq_part = data;
/* Цикл for(i=0;i<dot;i++) aliq_part/=10;; задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<dot;i++) aliq_part/=10;
/* Записывает dat значением aliq_part; данные dat. */
dat = aliq_part;
/* Повторяет или ожидает, пока выполняется while(dat>0). */
while(dat>0)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Делит dat значением 10; данные dat. */
aliq_len++; dat/=10;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает dat значением data; данные dat. */
dat = data;
/* Записывает full_len значением aliq_len+sgn; данные full_len. */
full_len = aliq_len+sgn;
/* Проверяет if(full_len==0) full_len=1; последующий оператор выполняется только при истинном условии. */
if(full_len==0) full_len=1;
/* Увеличивает full_len значением dot; данные full_len. */
full_len += dot;
/* Цикл for(i=0; i<(full_len-4);i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0; i<(full_len-4);i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Начинает цикл с проверкой условия после тела: первый проход выполняется всегда. */
dot--; dat/=10;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(dot<0) dot=0; последующий оператор выполняется только при истинном условии. */
if(dot<0) dot=0;
/* Записывает punkt значением 1<<dot; данные punkt. */
punkt = 1<<dot;
/* Проверяет if(punkt==1) punkt=0; последующий оператор выполняется только при истинном условии. */
if(punkt==1) punkt=0;
/* Записывает dg[3] значением (dat)/1000; данные dg. */
dg[3] = (dat)/1000;
/* Записывает dg[2] значением (dat%1000)/100; данные dg. */
dg[2] = (dat%1000)/100;
/* Записывает dg[1] значением (dat%100)/10; данные dg. */
dg[1] = (dat%100)/10;
/* Записывает dg[0] значением (dat%10); данные dg. */
dg[0] = (dat%10);
/* Проверяет if(dg[0]+dg[1]+dg[2]+dg[3]==0); последующий оператор выполняется только при истинном условии. */
if(dg[0]+dg[1]+dg[2]+dg[3]==0)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает punkt значением 0; dot=0; sgn=0; данные punkt. */
punkt=0; dot=0; sgn=0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(isdot); последующий оператор выполняется только при истинном условии. */
if(isdot)
/* Цикл for(i=3;i>0;i--); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=3;i>0;i--)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if((dg[i]==0) и (i!=dot)); последующий оператор выполняется только при истинном условии. */
if((dg[i]==0)&&(i!=dot))
/* Записывает dg[i] значением 0xF; данные dg. */
dg[i]=0xF; // Это значит пусто
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else break;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(sgn); последующий оператор выполняется только при истинном условии. */
if(sgn)
/* Цикл for(i=1;i<4;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=1;i<4;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if( (dg[i]==0xF) или (i==3)); последующий оператор выполняется только при истинном условии. */
if( (dg[i]==0xF)||(i==3))
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает dg[i] значением 0xA; данные dg. */
dg[i]=0xA; // Это значит минус
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
/* Цикл for(i=0;i<4;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<4;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает dg[i] значением digits[dg[i]]; данные dg. */
dg[i] = digits[dg[i]];
/* Проверяет if((punkt>>i)&1) dg[i]+= 128; последующий оператор выполняется только при истинном условии. */
if((punkt>>i)&1) dg[i]+= 128;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает Word значением ((dg[0] ) & 0x000000FF) | ((dg[1]<<8 ) & 0x0000FF00) |; слово. */
Word = ((dg[0] ) & 0x000000FF) | ((dg[1]<<8 ) & 0x0000FF00) |
/* Продолжает список аргументов, полей или выражение ((dg[2]<<16) & 0x00FF0000) | ((dg[3]<<24) & 0xFF000000);; порядок элементов сохраняется. */
((dg[2]<<16) & 0x00FF0000) | ((dg[3]<<24) & 0xFF000000);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает addr значением readr[adr]; данные addr. */
addr = readr[adr];
/* Цикл for (i=0;i<4;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for (i=0;i<4;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(addr>0x10) break; последующий оператор выполняется только при истинном условии. */
if(addr>0x10) break;
/* Цикл for (j=0;j<8;j++); задаёт начальное значение, условие продолжения и шаг перебора. */
for (j=0;j<8;j++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает bit значением Word & 1; Word >>= 1; представление регистра отдельными битовыми полями. */
bit = Word & 1; Word >>= 1;
/* Вызывает SENDBIT с аргументами (bit) в текущей последовательности операций. */
SENDBIT(bit);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает byt значением addr; данные byt. */
byt = addr;
/* Цикл for (j=0;j<6;j++); задаёт начальное значение, условие продолжения и шаг перебора. */
for (j=0;j<6;j++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает bit значением byt & 1; byt >>= 1; представление регистра отдельными битовыми полями. */
bit = byt & 1; byt >>= 1;
/* Вызывает SENDBIT с аргументами (bit) в текущей последовательности операций. */
SENDBIT(bit);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Изменяет счётчик в выражении addr++; на один для следующего шага. */
addr++;
/* Вызывает RESET с аргументами () в текущей последовательности операций. */
RESET();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}

View File

@@ -0,0 +1,37 @@
Бальзам-167: два проверочных варианта задержки индикации
Дата сборки: 12.10.2026.
A_delay_before_clock_fall
BIN: UKSSTMS320F28335_A_delay_before_clock_fall_fa20ed0+.bin
Дополнительная задержка стоит ПЕРЕД спадом CLOCK.
Последовательность: DSP28x_usDelay(POWS0+1); DCLK(0); DOUT(0).
Назначение: продлить высокий уровень CLOCK при действительном DATA.
Размер: 32246 байт. Запас до области параметров AT25256B: 262 байта.
SHA-256: C28337E35996AED330E22BC014EF9D15D06C9A1F5CFCCCE27EAD75FB1AC565F9
B_delay_after_clock_fall
BIN: UKSSTMS320F28335_B_delay_after_clock_fall_fa20ed0+.bin
Дополнительная задержка стоит ПОСЛЕ спада CLOCK, МЕЖДУ DCLK(0) и DOUT(0).
Последовательность: DCLK(0); DSP28x_usDelay(POWS0+1); DOUT(0).
Назначение: удержать DATA после спада CLOCK перед сбросом линии данных.
Размер: 32248 байт. Запас до области параметров AT25256B: 260 байт.
SHA-256: 1ABA3835FFA39649E9922E107B6DBAAA2605F7C4ED80631D583973EFC2DEC215
В каждом варианте только одна дополнительная задержка POWS0+1.
В обоих вариантах DATA сохраняется до спада CLOCK и сбрасывается после него.
Общие условные задержки POWS0 и POWS1 и разделитель RESET сохранены.
При CLKMULT=2 значения POWS0+1=1 и POWS1=30 являются аргументами
цикловой функции TI DSP28x_usDelay, а не длительностями в микросекундах.
Оба варианта полностью собраны TI C2000 22.6.0.LTS из текущего проекта.
Базовый коммит: fa20ed085bdca15fec47c79b72f50525653e103d; сборки помечены dirty.
Для каждого варианта при компиляции подставлен отдельный kanal.c,
сохранённый рядом с его BIN. Основной Source/Internal/kanal.c при подготовке
этой пары не изменялся. Общие параметры компиляции и прочие модули одинаковы;
паспорта также содержат собственное время сборки каждого варианта.
Проверено: полный цикл компиляции и линковки, структура SCI8 и предел EEPROM,
соответствие итогового BIN кандидату hex2000, расположение задержек в машинном
коде SENDBIT, передача 0 и 1 на обоих фронтах в модели логических уровней,
одинаковый код DCLK/DOUT между вариантами и прежний код разделителя RESET.
Физические длительности сигналов и отсутствие строба требуют проверки на плате.

View File

@@ -0,0 +1,48 @@
Бальзам-167: проверочная прошивка с исправлением TESTLAMP
Сборка: 13.10.2026, 11:00:35 (Москва, UTC+3).
Готовый образ:
UKSSTMS320F28335_testlamp_fix_fa20ed0+.bin
Размер: 32272 байта. Запас до параметров AT25256B: 236 байт.
SHA-256: bfe4c3c9b55bb5022f38f254929f893e5eaab57ef3d3fa31771a6b6f97f877a4
Паспорт: UKSSTMS320F28335_testlamp_fix_fa20ed0+.bin.manifest.json
Архив этой сборки: fa20ed08+_2026-10-13_11-00-35_UTC+3.
Исправления:
1. В get_Buttons для dsk_EPLT накопительный фильтр получает предыдущее
значение bTestLamp вместо постоянного нуля. Раньше даже один низкий
отсчёт GPIO26 при удержании кнопки сразу отключал тест, а следующий
высокий отсчёт мог снова его включить. Это переключало пакеты ламп
и семисегментных индикаторов между рабочим и тестовым режимами.
Порог 1000 по-прежнему измеряется опросами главного цикла.
2. cpu_timer1_isr_PULT ограничивает IER маской MINT13 и исключает собственный
Timer1 (INT13). Прежнее IER |= MINT13 включало дополнительные источники
вместо ограничения приоритетов и могло разрешить повторный вход Timer1.
Вложенная передача больше не может перемешать DATA/CLK, счётчик каналов
и фазу яркости. В машинном коде перед EINT проверено AND IER, #0x0139.
Штатная тестовая последовательность what_is сохранена: цифры меняются
и тестовая маска ламп переключается каждые 500 тактов Timer1 (0,5 секунды).
Это исправление относится к частому нерегулярному мерцанию поверх теста.
Порядок уровней и задержек SENDBIT/RESET взят из текущего kanal.c проекта;
для этой сборки он не изменялся. В образ вошли уже имевшиеся правки
ecan.c, measure.c и kanal.c.
Проверено:
- настоящие get_Buttons, er_anal, what_is и обработчик пульта в хостовой
модели при O3; короткие провалы входа при удержании TESTLAMP;
- тестовые пакеты ламп и цифр при уже включённой рабочей лампе;
- отсутствие повторного входа ISR, отпускание и удалённая команда теста;
- сохранение обычного PWM: шесть включённых тактов из десяти;
- возвращение каждой старой ошибки отдельно вызывает провал теста;
- полная компиляция и линковка TI C2000 22.6.0.LTS, O3, COFF, FPU32;
- SCI8, четыре RAM-блока, границы AT25256B и совпадение BIN с кандидатом;
- UTF-8 и русские пояснения к изменённому и добавленному коду.
Повторная проверка: python tests/testlamp/run_test.py
Повторная сборка: python Bin/TestLampFix/rebuild.py
На физической плате эта прошивка пока не проверена. Для проверки повторить
сценарий пользователя: включённые рабочие лампы, нажатие и удержание TESTLAMP,
затем отпускание. Штатные изменения теста раз в 0,5 секунды сохраняются;
быстрых переключений между тестовыми и рабочими показаниями быть не должно.

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@@ -75,6 +75,31 @@ static unsigned int ump_can_waiting;
/* Объявляет ump_can_sent_at — время последней передачи фрагмента ответа CAN. */
static unsigned long ump_can_sent_at;
/* Сбрасывает служебный обмен до включения CAN: загрузка COFF не гарантирует обнуление неинициализированной RAM. */
static void ump_can_init(void)
/* Начинает сброс состояния; InitCan вызывается при запрещённых глобальных прерываниях. */
{
/* Убирает остаточный запрос, чтобы главный цикл не обрабатывал команду из RAM предыдущего запуска. */
ump_can_pending = 0;
/* Сбрасывает идентификатор и функцию запроса; действительные значения поступят из CANa_handler. */
ump_can_tag = 0;
/* Сбрасывает адрес запрошенного регистра до приёма новой команды. */
ump_can_address = 0;
/* Сбрасывает прежнее значение записи или число запрошенных слов. */
ump_can_value = 0;
/* Нулевая длина запрещает отправку старого буфера; новый запрос заполнит все доступные для передачи слова. */
ump_can_length = 0;
/* Начинает следующий подготовленный ответ с первого слова, исключая продолжение старого фрагмента. */
ump_can_index = 0;
/* Убирает прежний идентификатор ответа и код ошибки до подготовки новой команды. */
ump_can_reply_tag = 0;
/* Отменяет ожидание подтверждения старой передачи, которая после включения ещё не запускалась. */
ump_can_waiting = 0;
/* Сбрасывает отметку тайм-аута в тактах Timer1; новый фрагмент установит актуальное время отправки. */
ump_can_sent_at = 0;
/* Завершает сброс управляющих полей; содержимое буфера недоступно при нулевой длине ответа. */
}
/* Настраивает eCAN, скорость, почтовые ящики и маршрутизацию прерываний для выбранного режима платы. */
void InitCan(int Port, int DevNum)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
@@ -92,6 +117,9 @@ void InitCan(int Port, int DevNum)
/* Объявляет id — данные id. Начальное значение задаётся справа от знака равенства. */
long id = 0x80BA0000;
/* Обнуляет состояние служебного обмена до настройки mailbox и разрешения прерываний CAN. */
ump_can_init();
/* Изменяет счётчик в выражении DevNum--; на один для следующего шага. */
DevNum--;
/* Проверяет if(DevNum<0)DevNum=0; последующий оператор выполняется только при истинном условии. */

View File

@@ -148,7 +148,7 @@ void RESET()
void SENDBIT(int x)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Выставляет передаваемый бит DATA до подъёма CLOCK, чтобы данные присутствовали на линии на протяжении импульса такта. */
/* Вызывает DOUT с аргументами (x); DCLK(1) в текущей последовательности операций. */
DOUT(x); DCLK(1);
/* Условие компиляции POWS0>0: выбранный блок включается в текущий вариант прошивки. */
#if POWS0>0
@@ -156,12 +156,12 @@ void SENDBIT(int x)
DSP28x_usDelay(POWS0);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Удерживает CLOCK высоким при действительном DATA; POWS0+1 сохраняет прежний аргумент цикловой задержки TI из SENDBIT, а не задаёт число микросекунд. */
DSP28x_usDelay(POWS0+1);
/* Сначала опускает CLOCK при ещё действительном DATA; восстанавливает прежний порядок пользователя и сохраняет бит для приёмника, считывающего по спаду. */
DCLK(0);
/* Сбрасывает DATA только после спада CLOCK, чтобы завершающий фронт такта не считывал принудительный ноль вместо единичного бита. */
/* Вызывает DOUT с аргументами (0) в текущей последовательности операций. */
DOUT(0);
/* Вызывает DSP28x_usDelay с аргументами (POWS0+1) в текущей последовательности операций. */
DSP28x_usDelay(POWS0+1);
/* Вызывает DCLK с аргументами (0) в текущей последовательности операций. */
DCLK(0);
/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */
#if POWS1>0
/* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */

View File

@@ -829,8 +829,8 @@ void Current_count(int chan)
/* Записывает sens значением pow_addr + chan; данные sens. */
sens = pow_addr + chan;
/* Записывает pair значением sens_pair[chan]; данные pair. */
pair = sens_pair[chan];
/* Младший бит локального канала АЦП выбирает соседнюю фазу (0 <-> 1, 2 <-> 3); sens_pair хранит глобальные номера датчиков со смещением pow_addr и не подходит для индексации lev_count. */
pair = chan ^ 1;
/* Записывает ist значением !(chan & 1); данные ist. */
ist = !(chan & 1);
/* Записывает feed значением (chan >>1); данные feed. */

View File

@@ -405,8 +405,8 @@ void get_Buttons()
if(Desk==dsk_EPLT)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает bTestLamp значением er_anal(GpioDataRegs.GPADAT.bit.GPIO26, &INcount0, 1000, 0); данные bTestLamp. */
bTestLamp = er_anal(GpioDataRegs.GPADAT.bit.GPIO26, &INcount0, 1000, 0);
/* Сохраняет предыдущее состояние TESTLAMP, пока накопитель INcount0 не достигнет одного из порогов; 1000 — число опросов главного цикла, а не миллисекунды. Краткий провал GPIO26 больше не переключает передачу с тестовых масок на рабочие. */
bTestLamp = er_anal(GpioDataRegs.GPADAT.bit.GPIO26, &INcount0, 1000, bTestLamp);
/* Проверяет if(GpioDataRegs.GPADAT.bit.GPIO27) butt +=0x0001; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPADAT.bit.GPIO27) butt +=0x0001;

View File

@@ -75,8 +75,8 @@ interrupt void cpu_timer1_isr_PULT(void)
EALLOW;
/* Изменяет счётчик в выражении CpuTimer1.InterruptCount++; на один для следующего шага. */
CpuTimer1.InterruptCount++;
/* Устанавливает биты IER значением MINT13; регистр разрешения прерываний ядра C28x. */
IER |= MINT13; // Set "global" priority
/* Оставляет только ранее разрешённые источники более высокого приоритета по маске TI MINT13 и запрещает повторный Timer1 через M_INT13 (бит 12 IER); вложенная передача не должна перемешивать фронты DATA/CLK и менять фазу яркости. IRET восстановит маску вызывающего кода. */
IER &= (MINT13 & ~M_INT13);
/* Разрешение маскируемых прерываний ядра. */
EINT;
/* Закрытие доступа к защищённым регистрам периферии. */

View File

@@ -1,10 +1,10 @@
******************************************************************************
TMS320C2000 Linker PC v22.6.0
******************************************************************************
>> Linked Mon Oct 12 18:16:05 2026
>> Linked Tue Oct 13 14:10:06 2026
OUTPUT FILE NAME: <K:/git_project/Balsam_167_periph/UKSSTMS320F28335/../bin/UKSSTMS320F28335.out>
ENTRY POINT SYMBOL: "_c_int00" address: 0000a8cd
ENTRY POINT SYMBOL: "_c_int00" address: 0000a8d9
MEMORY CONFIGURATION
@@ -13,7 +13,7 @@ MEMORY CONFIGURATION
---------------------- -------- --------- -------- -------- ---- --------
PAGE 0:
ZONE0 00004000 00001000 00000000 00001000 RWIX
RAML0 00008000 00004000 00003afd 00000503 RWIX
RAML0 00008000 00004000 00003b0a 000004f6 RWIX
RAML4 0000c000 00001000 000003e6 00000c1a RWIX
ZONE6 00100000 00100000 00000000 00100000 RWIX
FLASHH 00300000 00008000 00000000 00008000 RWIX
@@ -126,12 +126,12 @@ section page origin length input sections
.pinit 0 00008000 00000000 UNINITIALIZED
.text 0 00008000 00003afd
00008000 0000025a measure.obj (.text:_Current_count)
0000825a 000001dd ADC.obj (.text:_adc_isr)
00008437 000001a7 measure.obj (.text:_Temper_count)
000085de 000001a6 main.obj (.text:_main)
00008784 000001a3 peripher.obj (.text:_get_Buttons)
.text 0 00008000 00003b0a
00008000 00000257 measure.obj (.text:_Current_count)
00008257 000001dd ADC.obj (.text:_adc_isr)
00008434 000001a7 measure.obj (.text:_Temper_count)
000085db 000001a6 peripher.obj (.text:_get_Buttons)
00008781 000001a6 main.obj (.text:_main)
00008927 0000018d ADC.obj (.text:_setup_adc)
00008ab4 00000184 measure.obj (.text:_cpu_timer1_isr_SENS)
00008c38 0000015f RS485.obj (.text:_RS_RX_Handler)
@@ -144,214 +144,214 @@ section page origin length input sections
000094a1 000000f9 measure.obj (.text:_Power_count)
0000959a 000000ec message.obj (.text:_Default_params)
00009686 000000e5 RS485.obj (.text:_setup_uart)
0000976b 000000b3 log_to_mem.obj (.text:_ump_log_read)
0000981e 000000ae measure.obj (.text:_calc_sensor_koef)
000098cc 000000ac ecan.obj (.text:_InitCan)
00009978 000000a8 ecan.obj (.text:_UMP_CAN_service)
00009a20 0000009d message.obj (.text:_ReceiveCommandModbus3)
00009abd 0000009c peripher.obj (.text:_select_tpl_canal)
00009b59 00000097 bios.obj (.text:_upload)
00009bf0 00000094 measure.obj (.text:_Init_packMask)
00009c84 00000092 RS485.obj (.text:_RS_FifoTx)
00009d16 0000008c message.obj (.text:_receive_ump)
00009da2 0000008a log_to_mem.obj (.text:_ump_capture)
00009e2c 00000088 rts2800_fpu32.lib : fs_div.obj (.text)
00009eb4 00000085 DSP2833x_SysCtrl.obj (.text:_InitPeripheralClocks)
00009f39 00000084 bios.obj (.text:_extendbios)
00009fbd 00000001 bios.obj (.text:_init)
00009fbe 00000083 shared_ump.obj (.text:_ump_rtu_encode)
0000a041 00000082 DSP2833x_SysCtrl.obj (.text:_InitPll)
0000a0c3 00000078 bios.obj (.text:_peek)
0000a13b 00000072 ecan.obj (.text:_Handlai)
0000a1ad 00000071 shared_ump.obj (.text:_ump_validate)
0000a21e 00000070 log_to_mem.obj (.text:_ump_log_write)
0000a28e 0000006e RS485.obj (.text:_RS_TX_Handler)
0000a2fc 00000069 DAC.obj (.text:_Load_protection_prepare)
0000a365 00000062 measure.obj (.text:_Init_sensors_more)
0000a3c7 00000059 DSP2833x_Xintf.obj (.text:_InitXintf16Gpio)
0000a420 00000057 bios.obj (.text:_get_command)
0000a477 00000050 message.obj (.text:_ReceiveCommandModbus6)
0000a4c7 0000004f RS485.obj (.text:_RS_FifoStart)
0000a516 0000004e DAC.obj (.text:_anal_output)
0000a564 0000004e DAC.obj (.text:_load_start)
0000a5b2 0000004d shared_ump.obj (.text:_ump_prepare)
0000a5ff 0000004b RS485.obj (.text:_RS_Send)
0000a64a 0000004a ecan.obj (.text:_CANa_handler)
0000a694 00000049 RS485.obj (.text:_RS_FifoAbort)
0000a6dd 00000049 bios.obj (.text:_load)
0000a726 00000048 ecan.obj (.text:_CAN_send)
0000a76e 00000047 bios.obj (.text:_initload)
0000a7b5 00000046 RS485.obj (.text:_RSA_RX_Handler)
0000a7fb 00000046 RS485.obj (.text:_RSA_TX_Handler)
0000a841 00000046 RS485.obj (.text:_RSB_RX_Handler)
0000a887 00000046 RS485.obj (.text:_RSB_TX_Handler)
0000a8cd 00000046 rts2800_fpu32.lib : boot.obj (.text)
0000a913 00000042 log_to_mem.obj (.text:_ump_log_can)
0000a955 00000041 spise2p.obj (.text:_Seeprom_read)
0000a996 00000041 spise2p.obj (.text:_Seeprom_write)
0000a9d7 00000041 RS485.obj (.text:_setup_arr_cmd_length)
0000aa18 00000040 message.obj (.text:_Load_params)
0000aa58 0000003e RS485.obj (.text:_RS_SetLineSpeed)
0000aa96 0000003e tools.obj (.text:_init_zone7)
0000aad4 0000003b DSP2833x_CpuTimers.obj (.text:_InitCpuTimers)
0000ab0f 0000003b DAC.obj (.text:_Load_voltage_can)
0000ab4a 0000003b shared_ump.obj (.text:_ump_can_fragment)
0000ab85 0000003a bios.obj (.text:_poke)
0000abbf 00000039 spise2p.obj (.text:_cpu_timer2_isr)
0000abf8 00000038 message.obj (.text:_SendCommandModbus4)
0000ac30 00000038 shared_ump.obj (.text:_ump_tms28335_fragment)
0000ac68 00000037 RS485.obj (.text:_RS_BSend)
0000ac9f 00000001 bios.obj (.text:_run)
0000aca0 00000037 message.obj (.text:_ReceiveAnswerModbus4)
0000acd7 00000033 bios.obj (.text:_Answer)
0000ad0a 00000033 message.obj (.text:_modbus_exception)
0000ad3d 00000033 log_to_mem.obj (.text:_ump_word)
0000ad70 00000032 spise2p.obj (.text:_SPISE2P_DRV_init)
0000ada2 00000032 peripher.obj (.text:_unsetup_leds_line)
0000add4 00000031 DAC.obj (.text:_dSEND)
0000ae05 0000002f RS485.obj (.text:_RS_FifoTick1ms)
0000ae34 0000002e filter_bat2.obj (.text:_filterbat)
0000ae62 0000002e log_to_mem.obj (.text:_ump_log_io)
0000ae90 0000002d RS485.obj (.text:_RS_SetLineMode)
0000aebd 0000002d main.obj (.text:_timer_Init)
0000aeea 0000002c crc16.obj (.text:_get_crc_16b)
0000af16 0000002b ecan.obj (.text:_CANa_reset_err)
0000af41 0000002a rts2800_fpu32.lib : l_div.obj (.text)
0000af6b 00000029 spise2p.obj (.text:_InitSeeprom)
0000af94 00000027 crc16.obj (.text:_get_crc16)
0000afbb 00000024 message.obj (.text:_Save_params)
0000afdf 00000024 DAC.obj (.text:_load_stop)
0000b003 00000024 peripher.obj (.text:_select_tpl_255)
0000b027 00000022 peripher.obj (.text:_setup_leds_line)
0000b049 00000021 DSP2833x_CpuTimers.obj (.text:_ConfigCpuTimer)
0000b06a 00000020 DAC.obj (.text:_Setup_DAC_time)
0000b08a 00000020 rts2800_fpu32.lib : sqrt.obj (.text)
0000b0aa 0000001f DSP2833x_PieCtrl.obj (.text:_InitPieCtrl)
0000b0c9 0000001f measure.obj (.text:_reset_errs)
0000b0e8 0000001e DAC.obj (.text:_Load_control_init)
0000b106 0000001d log_to_mem.obj (.text:_ump_log_init)
0000b123 0000001d shared_ump.obj (.text:_ump_tms28335_prepare)
0000b140 0000001d pulto.obj (.text:_what_is)
0000b15d 0000001c DAC.obj (.text:_Init_DAC)
0000b179 0000001c measure.obj (.text:_im_calc)
0000b195 0000001c shared_ump.obj (.text:_ump_crc)
0000b1b1 0000001c shared_ump.obj (.text:_ump_tms28335_capture)
0000b1cd 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ADCINT_ISR)
0000b1e8 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_DINTCH1_ISR)
0000b203 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_DINTCH2_ISR)
0000b21e 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_DINTCH3_ISR)
0000b239 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_DINTCH4_ISR)
0000b254 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_DINTCH5_ISR)
0000b26f 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_DINTCH6_ISR)
0000b28a 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAN0INTA_ISR)
0000b2a5 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAN0INTB_ISR)
0000b2c0 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAN1INTA_ISR)
0000b2db 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAN1INTB_ISR)
0000b2f6 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAP1_INT_ISR)
0000b311 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAP2_INT_ISR)
0000b32c 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAP3_INT_ISR)
0000b347 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAP4_INT_ISR)
0000b362 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAP5_INT_ISR)
0000b37d 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAP6_INT_ISR)
0000b398 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM1_INT_ISR)
0000b3b3 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM1_TZINT_ISR)
0000b3ce 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM2_INT_ISR)
0000b3e9 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM2_TZINT_ISR)
0000b404 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM3_INT_ISR)
0000b41f 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM3_TZINT_ISR)
0000b43a 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM4_INT_ISR)
0000b455 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM4_TZINT_ISR)
0000b470 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM5_INT_ISR)
0000b48b 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM5_TZINT_ISR)
0000b4a6 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM6_INT_ISR)
0000b4c1 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM6_TZINT_ISR)
0000b4dc 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EQEP1_INT_ISR)
0000b4f7 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EQEP2_INT_ISR)
0000b512 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_I2CINT1A_ISR)
0000b52d 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_I2CINT2A_ISR)
0000b548 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_LUF_ISR)
0000b563 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_LVF_ISR)
0000b57e 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_MRINTA_ISR)
0000b599 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_MRINTB_ISR)
0000b5b4 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_MXINTA_ISR)
0000b5cf 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_MXINTB_ISR)
0000b5ea 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SCIRXINTA_ISR)
0000b605 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SCIRXINTB_ISR)
0000b620 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SCIRXINTC_ISR)
0000b63b 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SCITXINTA_ISR)
0000b656 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SCITXINTB_ISR)
0000b671 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SCITXINTC_ISR)
0000b68c 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SEQ1INT_ISR)
0000b6a7 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SEQ2INT_ISR)
0000b6c2 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SPIRXINTA_ISR)
0000b6dd 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SPITXINTA_ISR)
0000b6f8 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_TINT0_ISR)
0000b713 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_WAKEINT_ISR)
0000b72e 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_XINT3_ISR)
0000b749 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_XINT4_ISR)
0000b764 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_XINT5_ISR)
0000b77f 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_XINT6_ISR)
0000b79a 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_XINT7_ISR)
0000b7b5 0000001b rts2800_fpu32.lib : args_main.obj (.text)
0000b7d0 0000001a RS485.obj (.text:_RS_SetBitMode)
0000b7ea 0000001a RS485.obj (.text:_create_uart_vars)
0000b804 00000019 DSP2833x_Adc.obj (.text:_InitAdc)
0000b81d 00000019 DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_XINT1_ISR)
0000b836 00000019 DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_XINT2_ISR)
0000b84f 00000019 rts2800_fpu32.lib : exit.obj (.text)
0000b868 00000019 : prolog.obj (.text)
0000b881 00000018 log_to_mem.obj (.text:_ump_log_tick)
0000b899 00000017 log_to_mem.obj (.text:_clear_mem)
0000b8b0 00000016 DSP2833x_SysCtrl.obj (.text:_ServiceDog)
0000b8c6 00000014 bios.obj (.text:__getbyte)
0000b8da 00000014 measure.obj (.text:_er_anal)
0000b8ee 00000014 log_to_mem.obj (.text:_ump_outputs)
0000b902 00000013 kanal.obj (.text:_RESET)
0000b915 00000013 RS485.obj (.text:_RS_FifoWait)
0000b928 00000013 log_to_mem.obj (.text:_ump_inputs)
0000b93b 00000012 crc16.obj (.text:_get_crc_16)
0000b94d 00000011 kanal.obj (.text:_SENDBIT)
0000b95e 00000010 tools.obj (.text:_pause_us)
0000b96e 00000010 shared_ump.obj (.text:_read_word)
0000b97e 0000000d DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_DATALOG_ISR)
0000b98b 0000000d DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_INT13_ISR)
0000b998 0000000d DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_INT14_ISR)
0000b9a5 0000000d DSP2833x_SWPrioritizedPieVect.obj (.text:_InitPieVectTable)
0000b9b2 0000000d DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_RTOSINT_ISR)
0000b9bf 0000000c kanal.obj (.text:_DCLK)
0000b9cb 0000000c kanal.obj (.text:_DOUT)
0000b9d7 0000000c rts2800_fpu32.lib : epilog.obj (.text)
0000b9e3 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EMUINT_ISR)
0000b9ee 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ILLEGAL_ISR)
0000b9f9 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_NMI_ISR)
0000ba04 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER10_ISR)
0000ba0f 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER11_ISR)
0000ba1a 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER12_ISR)
0000ba25 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER1_ISR)
0000ba30 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER2_ISR)
0000ba3b 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER3_ISR)
0000ba46 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER4_ISR)
0000ba51 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER5_ISR)
0000ba5c 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER6_ISR)
0000ba67 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER7_ISR)
0000ba72 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER8_ISR)
0000ba7d 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER9_ISR)
0000ba88 0000000b log_to_mem.obj (.text:_ump_log_rs)
0000ba93 0000000b rts2800_fpu32.lib : u_div.obj (.text)
0000ba9e 0000000a DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_INT_NOTUSED_ISR)
0000baa8 0000000a DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_PIE_RESERVED)
0000bab2 0000000a DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_rsvd_ISR)
0000babc 00000009 DSP2833x_PieCtrl.obj (.text:_EnableInterrupts)
0000bac5 00000009 DSP2833x_SysCtrl.obj (.text:_InitSysCtrl)
0000bace 00000009 rts2800_fpu32.lib : _lock.obj (.text)
0000bad7 00000008 DSP2833x_SysCtrl.obj (.text:_DisableDog)
0000badf 00000007 rts2800_fpu32.lib : memset.obj (.text)
0000bae6 00000005 spise2p.obj (.text:_SPISE2P_DRV_csclr)
0000baeb 00000005 spise2p.obj (.text:_SPISE2P_DRV_csset)
0000baf0 00000005 cntrl_adr.obj (.text:_set_cntrl_addr)
0000baf5 00000004 DSP2833x_usDelay.obj (.text)
0000baf9 00000003 shared_ump.obj (.text:_write_word)
0000bafc 00000001 bios.obj (.text:_tflash)
0000976b 000000b8 ecan.obj (.text:_InitCan)
00009823 000000b3 log_to_mem.obj (.text:_ump_log_read)
000098d6 000000ae measure.obj (.text:_calc_sensor_koef)
00009984 000000a8 ecan.obj (.text:_UMP_CAN_service)
00009a2c 0000009d message.obj (.text:_ReceiveCommandModbus3)
00009ac9 0000009c peripher.obj (.text:_select_tpl_canal)
00009b65 00000097 bios.obj (.text:_upload)
00009bfc 00000094 measure.obj (.text:_Init_packMask)
00009c90 00000092 RS485.obj (.text:_RS_FifoTx)
00009d22 0000008c message.obj (.text:_receive_ump)
00009dae 0000008a log_to_mem.obj (.text:_ump_capture)
00009e38 00000088 rts2800_fpu32.lib : fs_div.obj (.text)
00009ec0 00000085 DSP2833x_SysCtrl.obj (.text:_InitPeripheralClocks)
00009f45 00000084 bios.obj (.text:_extendbios)
00009fc9 00000001 bios.obj (.text:_init)
00009fca 00000083 shared_ump.obj (.text:_ump_rtu_encode)
0000a04d 00000082 DSP2833x_SysCtrl.obj (.text:_InitPll)
0000a0cf 00000078 bios.obj (.text:_peek)
0000a147 00000072 ecan.obj (.text:_Handlai)
0000a1b9 00000071 shared_ump.obj (.text:_ump_validate)
0000a22a 00000070 log_to_mem.obj (.text:_ump_log_write)
0000a29a 0000006e RS485.obj (.text:_RS_TX_Handler)
0000a308 00000069 DAC.obj (.text:_Load_protection_prepare)
0000a371 00000062 measure.obj (.text:_Init_sensors_more)
0000a3d3 00000059 DSP2833x_Xintf.obj (.text:_InitXintf16Gpio)
0000a42c 00000057 bios.obj (.text:_get_command)
0000a483 00000050 message.obj (.text:_ReceiveCommandModbus6)
0000a4d3 0000004f RS485.obj (.text:_RS_FifoStart)
0000a522 0000004e DAC.obj (.text:_anal_output)
0000a570 0000004e DAC.obj (.text:_load_start)
0000a5be 0000004d shared_ump.obj (.text:_ump_prepare)
0000a60b 0000004b RS485.obj (.text:_RS_Send)
0000a656 0000004a ecan.obj (.text:_CANa_handler)
0000a6a0 00000049 RS485.obj (.text:_RS_FifoAbort)
0000a6e9 00000049 bios.obj (.text:_load)
0000a732 00000048 ecan.obj (.text:_CAN_send)
0000a77a 00000047 bios.obj (.text:_initload)
0000a7c1 00000046 RS485.obj (.text:_RSA_RX_Handler)
0000a807 00000046 RS485.obj (.text:_RSA_TX_Handler)
0000a84d 00000046 RS485.obj (.text:_RSB_RX_Handler)
0000a893 00000046 RS485.obj (.text:_RSB_TX_Handler)
0000a8d9 00000046 rts2800_fpu32.lib : boot.obj (.text)
0000a91f 00000042 log_to_mem.obj (.text:_ump_log_can)
0000a961 00000041 spise2p.obj (.text:_Seeprom_read)
0000a9a2 00000041 spise2p.obj (.text:_Seeprom_write)
0000a9e3 00000041 RS485.obj (.text:_setup_arr_cmd_length)
0000aa24 00000040 message.obj (.text:_Load_params)
0000aa64 0000003e RS485.obj (.text:_RS_SetLineSpeed)
0000aaa2 0000003e tools.obj (.text:_init_zone7)
0000aae0 0000003b DSP2833x_CpuTimers.obj (.text:_InitCpuTimers)
0000ab1b 0000003b DAC.obj (.text:_Load_voltage_can)
0000ab56 0000003b shared_ump.obj (.text:_ump_can_fragment)
0000ab91 0000003a bios.obj (.text:_poke)
0000abcb 00000039 spise2p.obj (.text:_cpu_timer2_isr)
0000ac04 00000038 message.obj (.text:_SendCommandModbus4)
0000ac3c 00000038 shared_ump.obj (.text:_ump_tms28335_fragment)
0000ac74 00000037 RS485.obj (.text:_RS_BSend)
0000acab 00000001 bios.obj (.text:_run)
0000acac 00000037 message.obj (.text:_ReceiveAnswerModbus4)
0000ace3 00000033 bios.obj (.text:_Answer)
0000ad16 00000033 message.obj (.text:_modbus_exception)
0000ad49 00000033 log_to_mem.obj (.text:_ump_word)
0000ad7c 00000032 spise2p.obj (.text:_SPISE2P_DRV_init)
0000adae 00000032 peripher.obj (.text:_unsetup_leds_line)
0000ade0 00000031 DAC.obj (.text:_dSEND)
0000ae11 0000002f RS485.obj (.text:_RS_FifoTick1ms)
0000ae40 0000002e filter_bat2.obj (.text:_filterbat)
0000ae6e 0000002e log_to_mem.obj (.text:_ump_log_io)
0000ae9c 0000002d RS485.obj (.text:_RS_SetLineMode)
0000aec9 0000002d main.obj (.text:_timer_Init)
0000aef6 0000002c crc16.obj (.text:_get_crc_16b)
0000af22 0000002b ecan.obj (.text:_CANa_reset_err)
0000af4d 0000002a rts2800_fpu32.lib : l_div.obj (.text)
0000af77 00000029 spise2p.obj (.text:_InitSeeprom)
0000afa0 00000027 crc16.obj (.text:_get_crc16)
0000afc7 00000024 message.obj (.text:_Save_params)
0000afeb 00000024 DAC.obj (.text:_load_stop)
0000b00f 00000024 peripher.obj (.text:_select_tpl_255)
0000b033 00000022 peripher.obj (.text:_setup_leds_line)
0000b055 00000021 DSP2833x_CpuTimers.obj (.text:_ConfigCpuTimer)
0000b076 00000020 DAC.obj (.text:_Setup_DAC_time)
0000b096 00000020 rts2800_fpu32.lib : sqrt.obj (.text)
0000b0b6 0000001f DSP2833x_PieCtrl.obj (.text:_InitPieCtrl)
0000b0d5 0000001f measure.obj (.text:_reset_errs)
0000b0f4 0000001e DAC.obj (.text:_Load_control_init)
0000b112 0000001d log_to_mem.obj (.text:_ump_log_init)
0000b12f 0000001d shared_ump.obj (.text:_ump_tms28335_prepare)
0000b14c 0000001d pulto.obj (.text:_what_is)
0000b169 0000001c DAC.obj (.text:_Init_DAC)
0000b185 0000001c measure.obj (.text:_im_calc)
0000b1a1 0000001c shared_ump.obj (.text:_ump_crc)
0000b1bd 0000001c shared_ump.obj (.text:_ump_tms28335_capture)
0000b1d9 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ADCINT_ISR)
0000b1f4 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_DINTCH1_ISR)
0000b20f 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_DINTCH2_ISR)
0000b22a 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_DINTCH3_ISR)
0000b245 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_DINTCH4_ISR)
0000b260 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_DINTCH5_ISR)
0000b27b 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_DINTCH6_ISR)
0000b296 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAN0INTA_ISR)
0000b2b1 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAN0INTB_ISR)
0000b2cc 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAN1INTA_ISR)
0000b2e7 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAN1INTB_ISR)
0000b302 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAP1_INT_ISR)
0000b31d 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAP2_INT_ISR)
0000b338 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAP3_INT_ISR)
0000b353 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAP4_INT_ISR)
0000b36e 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAP5_INT_ISR)
0000b389 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAP6_INT_ISR)
0000b3a4 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM1_INT_ISR)
0000b3bf 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM1_TZINT_ISR)
0000b3da 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM2_INT_ISR)
0000b3f5 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM2_TZINT_ISR)
0000b410 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM3_INT_ISR)
0000b42b 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM3_TZINT_ISR)
0000b446 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM4_INT_ISR)
0000b461 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM4_TZINT_ISR)
0000b47c 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM5_INT_ISR)
0000b497 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM5_TZINT_ISR)
0000b4b2 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM6_INT_ISR)
0000b4cd 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM6_TZINT_ISR)
0000b4e8 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EQEP1_INT_ISR)
0000b503 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EQEP2_INT_ISR)
0000b51e 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_I2CINT1A_ISR)
0000b539 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_I2CINT2A_ISR)
0000b554 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_LUF_ISR)
0000b56f 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_LVF_ISR)
0000b58a 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_MRINTA_ISR)
0000b5a5 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_MRINTB_ISR)
0000b5c0 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_MXINTA_ISR)
0000b5db 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_MXINTB_ISR)
0000b5f6 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SCIRXINTA_ISR)
0000b611 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SCIRXINTB_ISR)
0000b62c 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SCIRXINTC_ISR)
0000b647 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SCITXINTA_ISR)
0000b662 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SCITXINTB_ISR)
0000b67d 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SCITXINTC_ISR)
0000b698 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SEQ1INT_ISR)
0000b6b3 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SEQ2INT_ISR)
0000b6ce 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SPIRXINTA_ISR)
0000b6e9 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SPITXINTA_ISR)
0000b704 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_TINT0_ISR)
0000b71f 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_WAKEINT_ISR)
0000b73a 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_XINT3_ISR)
0000b755 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_XINT4_ISR)
0000b770 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_XINT5_ISR)
0000b78b 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_XINT6_ISR)
0000b7a6 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_XINT7_ISR)
0000b7c1 0000001b rts2800_fpu32.lib : args_main.obj (.text)
0000b7dc 0000001a RS485.obj (.text:_RS_SetBitMode)
0000b7f6 0000001a RS485.obj (.text:_create_uart_vars)
0000b810 00000019 DSP2833x_Adc.obj (.text:_InitAdc)
0000b829 00000019 DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_XINT1_ISR)
0000b842 00000019 DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_XINT2_ISR)
0000b85b 00000019 rts2800_fpu32.lib : exit.obj (.text)
0000b874 00000019 : prolog.obj (.text)
0000b88d 00000018 log_to_mem.obj (.text:_ump_log_tick)
0000b8a5 00000017 log_to_mem.obj (.text:_clear_mem)
0000b8bc 00000016 DSP2833x_SysCtrl.obj (.text:_ServiceDog)
0000b8d2 00000014 bios.obj (.text:__getbyte)
0000b8e6 00000014 measure.obj (.text:_er_anal)
0000b8fa 00000014 log_to_mem.obj (.text:_ump_outputs)
0000b90e 00000013 kanal.obj (.text:_RESET)
0000b921 00000013 RS485.obj (.text:_RS_FifoWait)
0000b934 00000013 log_to_mem.obj (.text:_ump_inputs)
0000b947 00000012 kanal.obj (.text:_SENDBIT)
0000b959 00000012 crc16.obj (.text:_get_crc_16)
0000b96b 00000010 tools.obj (.text:_pause_us)
0000b97b 00000010 shared_ump.obj (.text:_read_word)
0000b98b 0000000d DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_DATALOG_ISR)
0000b998 0000000d DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_INT13_ISR)
0000b9a5 0000000d DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_INT14_ISR)
0000b9b2 0000000d DSP2833x_SWPrioritizedPieVect.obj (.text:_InitPieVectTable)
0000b9bf 0000000d DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_RTOSINT_ISR)
0000b9cc 0000000c kanal.obj (.text:_DCLK)
0000b9d8 0000000c kanal.obj (.text:_DOUT)
0000b9e4 0000000c rts2800_fpu32.lib : epilog.obj (.text)
0000b9f0 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EMUINT_ISR)
0000b9fb 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ILLEGAL_ISR)
0000ba06 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_NMI_ISR)
0000ba11 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER10_ISR)
0000ba1c 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER11_ISR)
0000ba27 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER12_ISR)
0000ba32 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER1_ISR)
0000ba3d 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER2_ISR)
0000ba48 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER3_ISR)
0000ba53 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER4_ISR)
0000ba5e 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER5_ISR)
0000ba69 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER6_ISR)
0000ba74 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER7_ISR)
0000ba7f 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER8_ISR)
0000ba8a 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER9_ISR)
0000ba95 0000000b log_to_mem.obj (.text:_ump_log_rs)
0000baa0 0000000b rts2800_fpu32.lib : u_div.obj (.text)
0000baab 0000000a DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_INT_NOTUSED_ISR)
0000bab5 0000000a DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_PIE_RESERVED)
0000babf 0000000a DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_rsvd_ISR)
0000bac9 00000009 DSP2833x_PieCtrl.obj (.text:_EnableInterrupts)
0000bad2 00000009 DSP2833x_SysCtrl.obj (.text:_InitSysCtrl)
0000badb 00000009 rts2800_fpu32.lib : _lock.obj (.text)
0000bae4 00000008 DSP2833x_SysCtrl.obj (.text:_DisableDog)
0000baec 00000007 rts2800_fpu32.lib : memset.obj (.text)
0000baf3 00000005 spise2p.obj (.text:_SPISE2P_DRV_csclr)
0000baf8 00000005 spise2p.obj (.text:_SPISE2P_DRV_csset)
0000bafd 00000005 cntrl_adr.obj (.text:_set_cntrl_addr)
0000bb02 00000004 DSP2833x_usDelay.obj (.text)
0000bb06 00000003 shared_ump.obj (.text:_write_word)
0000bb09 00000001 bios.obj (.text:_tflash)
ramfuncs 0 0000c000 00000000 UNINITIALIZED
@@ -658,25 +658,25 @@ MODULE SUMMARY
K:\git_project\Balsam_167_periph\Debug\Source\Internal\
log_to_mem.obj 718 52 64034
measure.obj 2458 87 1212
measure.obj 2455 87 1212
RS485.obj 1688 8 1878
message.obj 875 82 446
peripher.obj 972 32 16
peripher.obj 975 32 16
ADC.obj 874 13 74
DAC.obj 843 0 24
ecan.obj 643 28 148
ecan.obj 655 28 148
bios.obj 766 4 1
spise2p.obj 578 71 28
crc16.obj 101 259 256
shared_ump.obj 540 24 0
main.obj 467 0 5
pulto.obj 352 17 10
kanal.obj 327 27 21
kanal.obj 328 27 21
tools.obj 78 0 0
filter_bat2.obj 46 0 0
cntrl_adr.obj 5 11 4
+--+--------------------------------------+-------+------------------+--------------------+
Total: 12331 715 68157
Total: 12344 715 68157
K:/git_project/Balsam_167_periph/Libraries/rts2800_fpu32.lib
fs_div.obj 136 0 0
@@ -696,7 +696,7 @@ MODULE SUMMARY
Stack: 0 0 1008
+--+--------------------------------------+-------+------------------+--------------------+
Grand Total: 15108 995 71883
Grand Total: 15121 995 71883
GLOBAL DATA SYMBOLS: SORTED BY DATA PAGE
@@ -941,15 +941,15 @@ GLOBAL SYMBOLS: SORTED ALPHABETICALLY BY Name
page address name
---- ------- ----
0 00008000 .text
0 0000b84f C$$EXIT
0 00009e2c FS$$DIV
0 0000af41 L$$DIV
0 0000af50 L$$MOD
0 0000ba93 U$$DIV
0 0000ba98 U$$MOD
0 0000af5e UL$$DIV
0 0000af65 UL$$MOD
0 0000b1cd _ADCINT_ISR
0 0000b85b C$$EXIT
0 00009e38 FS$$DIV
0 0000af4d L$$DIV
0 0000af5c L$$MOD
0 0000baa0 U$$DIV
0 0000baa5 U$$MOD
0 0000af6a UL$$DIV
0 0000af71 UL$$MOD
0 0000b1d9 _ADCINT_ISR
0 00380080 _ADC_cal
1 0000df06 _ADC_table
0 0000c39c _ADDR_ANSWER
@@ -957,10 +957,10 @@ page address name
0 0000c39d _ADDR_TERMINAL
1 00000b00 _AdcMirror
1 00007100 _AdcRegs
0 0000acd7 _Answer
0 0000a726 _CAN_send
0 0000a64a _CANa_handler
0 0000af16 _CANa_reset_err
0 0000ace3 _Answer
0 0000a732 _CAN_send
0 0000a656 _CANa_handler
0 0000af22 _CANa_reset_err
1 0000de3d _CNTRL_ADDR
0 0000c39e _CNTRL_ADDR_UNIVERSAL
1 0000dfb5 _COUNT_DISCHARGE
@@ -970,7 +970,7 @@ page address name
1 0000dd03 _CanGO
1 0000dd02 _CanPowse
1 0000e000 _CanTimeOutErrorTR
0 0000b049 _ConfigCpuTimer
0 0000b055 _ConfigCpuTimer
1 0000df9c _CpuTimer0
1 00000c00 _CpuTimer0Regs
1 0000dfa4 _CpuTimer1
@@ -981,34 +981,34 @@ page address name
1 00000ae0 _CsmRegs
1 0000dd12 _Curr_Edge
0 00008000 _Current_count
0 0000b97e _DATALOG_ISR
0 0000b9bf _DCLK
0 0000b1e8 _DINTCH1_ISR
0 0000b203 _DINTCH2_ISR
0 0000b21e _DINTCH3_ISR
0 0000b239 _DINTCH4_ISR
0 0000b254 _DINTCH5_ISR
0 0000b26f _DINTCH6_ISR
0 0000b98b _DATALOG_ISR
0 0000b9cc _DCLK
0 0000b1f4 _DINTCH1_ISR
0 0000b20f _DINTCH2_ISR
0 0000b22a _DINTCH3_ISR
0 0000b245 _DINTCH4_ISR
0 0000b260 _DINTCH5_ISR
0 0000b27b _DINTCH6_ISR
1 0000dabc _DIR_GPIO32
1 0000dabd _DIR_GPIO48
0 0000b9cb _DOUT
0 0000baf5 _DSP28x_usDelay
0 0000b9d8 _DOUT
0 0000bb02 _DSP28x_usDelay
0 0000959a _Default_params
1 0000dab1 _Desk
1 00000880 _DevEmuRegs
1 0000dabe _DigErr
0 0000bad7 _DisableDog
0 0000bae4 _DisableDog
1 00001000 _DmaRegs
0 0000b28a _ECAN0INTA_ISR
0 0000b2a5 _ECAN0INTB_ISR
0 0000b2c0 _ECAN1INTA_ISR
0 0000b2db _ECAN1INTB_ISR
0 0000b2f6 _ECAP1_INT_ISR
0 0000b311 _ECAP2_INT_ISR
0 0000b32c _ECAP3_INT_ISR
0 0000b347 _ECAP4_INT_ISR
0 0000b362 _ECAP5_INT_ISR
0 0000b37d _ECAP6_INT_ISR
0 0000b296 _ECAN0INTA_ISR
0 0000b2b1 _ECAN0INTB_ISR
0 0000b2cc _ECAN1INTA_ISR
0 0000b2e7 _ECAN1INTB_ISR
0 0000b302 _ECAP1_INT_ISR
0 0000b31d _ECAP2_INT_ISR
0 0000b338 _ECAP3_INT_ISR
0 0000b353 _ECAP4_INT_ISR
0 0000b36e _ECAP5_INT_ISR
0 0000b389 _ECAP6_INT_ISR
1 00006040 _ECanaLAMRegs
1 000060c0 _ECanaMOTORegs
1 00006080 _ECanaMOTSRegs
@@ -1030,30 +1030,30 @@ abs 00007ffe _EEPROM_PARAMS_END_BYTE
abs 00007efc _EEPROM_PARAMS_START_BYTE
abs 00003f7e _EEPROM_PARAMS_START_WORD
abs 00008000 _EEPROM_TOTAL_BYTES
0 0000b9e3 _EMUINT_ISR
0 0000b398 _EPWM1_INT_ISR
0 0000b3b3 _EPWM1_TZINT_ISR
0 0000b3ce _EPWM2_INT_ISR
0 0000b3e9 _EPWM2_TZINT_ISR
0 0000b404 _EPWM3_INT_ISR
0 0000b41f _EPWM3_TZINT_ISR
0 0000b43a _EPWM4_INT_ISR
0 0000b455 _EPWM4_TZINT_ISR
0 0000b470 _EPWM5_INT_ISR
0 0000b48b _EPWM5_TZINT_ISR
0 0000b4a6 _EPWM6_INT_ISR
0 0000b4c1 _EPWM6_TZINT_ISR
0 0000b9f0 _EMUINT_ISR
0 0000b3a4 _EPWM1_INT_ISR
0 0000b3bf _EPWM1_TZINT_ISR
0 0000b3da _EPWM2_INT_ISR
0 0000b3f5 _EPWM2_TZINT_ISR
0 0000b410 _EPWM3_INT_ISR
0 0000b42b _EPWM3_TZINT_ISR
0 0000b446 _EPWM4_INT_ISR
0 0000b461 _EPWM4_TZINT_ISR
0 0000b47c _EPWM5_INT_ISR
0 0000b497 _EPWM5_TZINT_ISR
0 0000b4b2 _EPWM6_INT_ISR
0 0000b4cd _EPWM6_TZINT_ISR
1 00006800 _EPwm1Regs
1 00006840 _EPwm2Regs
1 00006880 _EPwm3Regs
1 000068c0 _EPwm4Regs
1 00006900 _EPwm5Regs
1 00006940 _EPwm6Regs
0 0000b4dc _EQEP1_INT_ISR
0 0000b4f7 _EQEP2_INT_ISR
0 0000b4e8 _EQEP1_INT_ISR
0 0000b503 _EQEP2_INT_ISR
1 00006b00 _EQep1Regs
1 00006b40 _EQep2Regs
0 0000babc _EnableInterrupts
0 0000bac9 _EnableInterrupts
1 0000e00a _ErrorCount
1 0000dfb7 _FILTER_CLIP
1 00000a80 _FlashRegs
@@ -1061,31 +1061,31 @@ abs 00008000 _EEPROM_TOTAL_BYTES
1 00006fc0 _GpioDataRegs
1 00006fe0 _GpioIntRegs
1 0000dc7e _HSPCLK
0 0000a13b _Handlai
0 0000b512 _I2CINT1A_ISR
0 0000b52d _I2CINT2A_ISR
0 0000a147 _Handlai
0 0000b51e _I2CINT1A_ISR
0 0000b539 _I2CINT2A_ISR
1 00007900 _I2caRegs
0 0000b9ee _ILLEGAL_ISR
0 0000b9fb _ILLEGAL_ISR
1 0000deba _IMPowse
0 0000b98b _INT13_ISR
0 0000b998 _INT14_ISR
0 0000ba9e _INT_NOTUSED_ISR
0 0000b998 _INT13_ISR
0 0000b9a5 _INT14_ISR
0 0000baab _INT_NOTUSED_ISR
1 0000dab8 _INcount0
1 0000dab9 _INcount1
0 0000b804 _InitAdc
0 000098cc _InitCan
0 0000aad4 _InitCpuTimers
0 00009eb4 _InitPeripheralClocks
0 0000b0aa _InitPieCtrl
0 0000b9a5 _InitPieVectTable
0 0000a041 _InitPll
0 0000af6b _InitSeeprom
0 0000bac5 _InitSysCtrl
0 0000a3c7 _InitXintf16Gpio
0 0000b15d _Init_DAC
0 00009bf0 _Init_packMask
0 0000b810 _InitAdc
0 0000976b _InitCan
0 0000aae0 _InitCpuTimers
0 00009ec0 _InitPeripheralClocks
0 0000b0b6 _InitPieCtrl
0 0000b9b2 _InitPieVectTable
0 0000a04d _InitPll
0 0000af77 _InitSeeprom
0 0000bad2 _InitSysCtrl
0 0000a3d3 _InitXintf16Gpio
0 0000b169 _Init_DAC
0 00009bfc _Init_packMask
0 00009036 _Init_sensors
0 0000a365 _Init_sensors_more
0 0000a371 _Init_sensors_more
1 0000dd1e _K100
1 0000dd20 _K_50
1 0000dd22 _K_T1
@@ -1093,118 +1093,118 @@ abs 00008000 _EEPROM_TOTAL_BYTES
1 0000dab6 _Kalibro
1 0000dab5 _Kurrent
1 0000dc7c _LSPCLK
0 0000b548 _LUF_ISR
0 0000b563 _LVF_ISR
0 0000b0e8 _Load_control_init
0 0000aa18 _Load_params
0 0000a2fc _Load_protection_prepare
0 0000b554 _LUF_ISR
0 0000b56f _LVF_ISR
0 0000b0f4 _Load_control_init
0 0000aa24 _Load_params
0 0000a308 _Load_protection_prepare
0 00008d97 _Load_runner
0 0000ab0f _Load_voltage_can
0 0000ab1b _Load_voltage_can
1 0000dea0 _Log
1 0000e032 _Lonely
0 0000b57e _MRINTA_ISR
0 0000b599 _MRINTB_ISR
0 0000b58a _MRINTA_ISR
0 0000b5a5 _MRINTB_ISR
1 0000daba _MUX_GPIO32
1 0000dabb _MUX_GPIO48
0 0000b5b4 _MXINTA_ISR
0 0000b5cf _MXINTB_ISR
0 0000b5c0 _MXINTA_ISR
0 0000b5db _MXINTB_ISR
1 0000d730 _Maska
1 00005000 _McbspaRegs
1 00005040 _McbspbRegs
1 0000e00c _MessageReceivedCount
1 0000e00e _MessageTransivedCount
1 0000dab0 _Mode
0 0000b9f9 _NMI_ISR
0 0000ba06 _NMI_ISR
1 0000dab7 _Owen
0 0000baa8 _PIE_RESERVED
0 0000bab5 _PIE_RESERVED
1 00380090 _PartIdRegs
1 00000ce0 _PieCtrlRegs
1 00000d00 _PieVectTable
0 0000c274 _PieVectTableInit
0 000094a1 _Power_count
1 0000dd04 _READY
0 0000b902 _RESET
0 0000a7b5 _RSA_RX_Handler
0 0000a7fb _RSA_TX_Handler
0 0000a841 _RSB_RX_Handler
0 0000a887 _RSB_TX_Handler
0 0000ac68 _RS_BSend
0 0000ae05 _RS_FifoTick1ms
0 0000b915 _RS_FifoWait
0 0000b90e _RESET
0 0000a7c1 _RSA_RX_Handler
0 0000a807 _RSA_TX_Handler
0 0000a84d _RSB_RX_Handler
0 0000a893 _RSB_TX_Handler
0 0000ac74 _RS_BSend
0 0000ae11 _RS_FifoTick1ms
0 0000b921 _RS_FifoWait
1 0000dec0 _RS_Len
0 00008c38 _RS_RX_Handler
0 0000a5ff _RS_Send
0 0000b7d0 _RS_SetBitMode
0 0000ae90 _RS_SetLineMode
0 0000aa58 _RS_SetLineSpeed
0 0000a28e _RS_TX_Handler
0 0000b9b2 _RTOSINT_ISR
0 0000a60b _RS_Send
0 0000b7dc _RS_SetBitMode
0 0000ae9c _RS_SetLineMode
0 0000aa64 _RS_SetLineSpeed
0 0000a29a _RS_TX_Handler
0 0000b9bf _RTOSINT_ISR
0 0000c000 _RamfuncsLoadEnd
0 0000c000 _RamfuncsLoadStart
0 0000c000 _RamfuncsRunStart
0 0000aca0 _ReceiveAnswerModbus4
0 00009a20 _ReceiveCommandModbus3
0 0000a477 _ReceiveCommandModbus6
0 0000b5ea _SCIRXINTA_ISR
0 0000b605 _SCIRXINTB_ISR
0 0000b620 _SCIRXINTC_ISR
0 0000b63b _SCITXINTA_ISR
0 0000b656 _SCITXINTB_ISR
0 0000b671 _SCITXINTC_ISR
0 0000b94d _SENDBIT
0 0000b68c _SEQ1INT_ISR
0 0000b6a7 _SEQ2INT_ISR
0 0000b6c2 _SPIRXINTA_ISR
0 0000bae6 _SPISE2P_DRV_csclr
0 0000baeb _SPISE2P_DRV_csset
0 0000ad70 _SPISE2P_DRV_init
0 0000acac _ReceiveAnswerModbus4
0 00009a2c _ReceiveCommandModbus3
0 0000a483 _ReceiveCommandModbus6
0 0000b5f6 _SCIRXINTA_ISR
0 0000b611 _SCIRXINTB_ISR
0 0000b62c _SCIRXINTC_ISR
0 0000b647 _SCITXINTA_ISR
0 0000b662 _SCITXINTB_ISR
0 0000b67d _SCITXINTC_ISR
0 0000b947 _SENDBIT
0 0000b698 _SEQ1INT_ISR
0 0000b6b3 _SEQ2INT_ISR
0 0000b6ce _SPIRXINTA_ISR
0 0000baf3 _SPISE2P_DRV_csclr
0 0000baf8 _SPISE2P_DRV_csset
0 0000ad7c _SPISE2P_DRV_init
0 0000915f _SPISE2P_DRV_tick
0 0000b6dd _SPITXINTA_ISR
0 0000b6e9 _SPITXINTA_ISR
1 0000dc7a _SYSCLKOUT
0 0000afbb _Save_params
0 0000afc7 _Save_params
1 00007050 _SciaRegs
1 00007750 _ScibRegs
1 00007770 _ScicRegs
0 0000a955 _Seeprom_read
0 0000a996 _Seeprom_write
0 0000abf8 _SendCommandModbus4
0 0000b8b0 _ServiceDog
0 0000b06a _Setup_DAC_time
0 0000a961 _Seeprom_read
0 0000a9a2 _Seeprom_write
0 0000ac04 _SendCommandModbus4
0 0000b8bc _ServiceDog
0 0000b076 _Setup_DAC_time
1 00007040 _SpiaRegs
1 00007010 _SysCtrlRegs
0 0000b6f8 _TINT0_ISR
0 0000b704 _TINT0_ISR
1 0000dd05 _TPL_CANS
0 00008437 _Temper_count
0 00008434 _Temper_count
1 0000dab2 _TermoAD
1 0000dab3 _TermoRS
1 0000dab4 _TermoSW
1 0000e010 _TestMbox1
1 0000e012 _TestMbox2
1 0000e014 _TestMbox3
0 00009978 _UMP_CAN_service
0 0000ba04 _USER10_ISR
0 0000ba0f _USER11_ISR
0 0000ba1a _USER12_ISR
0 0000ba25 _USER1_ISR
0 0000ba30 _USER2_ISR
0 0000ba3b _USER3_ISR
0 0000ba46 _USER4_ISR
0 0000ba51 _USER5_ISR
0 0000ba5c _USER6_ISR
0 0000ba67 _USER7_ISR
0 0000ba72 _USER8_ISR
0 0000ba7d _USER9_ISR
0 00009984 _UMP_CAN_service
0 0000ba11 _USER10_ISR
0 0000ba1c _USER11_ISR
0 0000ba27 _USER12_ISR
0 0000ba32 _USER1_ISR
0 0000ba3d _USER2_ISR
0 0000ba48 _USER3_ISR
0 0000ba53 _USER4_ISR
0 0000ba5e _USER5_ISR
0 0000ba69 _USER6_ISR
0 0000ba74 _USER7_ISR
0 0000ba7f _USER8_ISR
0 0000ba8a _USER9_ISR
1 0000dfbc _WAKE
0 0000b713 _WAKEINT_ISR
0 0000b71f _WAKEINT_ISR
1 0000dfbe _WAKE_TIME
1 0000deb8 _WAKEpowse
0 0000b81d _XINT1_ISR
0 0000b836 _XINT2_ISR
0 0000b72e _XINT3_ISR
0 0000b749 _XINT4_ISR
0 0000b764 _XINT5_ISR
0 0000b77f _XINT6_ISR
0 0000b79a _XINT7_ISR
0 0000b829 _XINT1_ISR
0 0000b842 _XINT2_ISR
0 0000b73a _XINT3_ISR
0 0000b755 _XINT4_ISR
0 0000b770 _XINT5_ISR
0 0000b78b _XINT6_ISR
0 0000b7a6 _XINT7_ISR
1 00007070 _XIntruptRegs
1 00000b20 _XintfRegs
1 000007f0 __STACK_END
@@ -1215,141 +1215,141 @@ abs ffffffff ___TI_prof_data_start
abs ffffffff ___binit__
abs ffffffff ___c_args__
0 0000c000 ___cinit__
0 0000bafd ___etext__
0 0000bb0a ___etext__
abs ffffffff ___pinit__
0 00008000 ___text__
0 0000b7b5 __args_main
0 0000b7c1 __args_main
1 0000e03c __cleanup_ptr
1 0000e03e __dtors_ptr
1 0000dffe __lock
0 0000bad6 __nop
0 0000bad2 __register_lock
0 0000bace __register_unlock
0 0000bae3 __nop
0 0000badf __register_lock
0 0000badb __register_unlock
1 00000400 __stack
1 0000dffc __unlock
0 0000b84f _abort
0 0000b85b _abort
1 0000d740 _adc_filter
0 0000825a _adc_isr
0 00008257 _adc_isr
1 0000ddbc _adc_table_lem
0 0000a8cd _c_int00
0 0000a8d9 _c_int00
1 0000dd07 _cal_addr
0 0000981e _calc_sensor_koef
0 000098d6 _calc_sensor_koef
1 0000df80 _ccc
1 0000dd0b _chk
0 0000b899 _clear_mem
0 0000b8a5 _clear_mem
1 0000de3e _cntr_addr_c
1 0000de3f _cntr_addr_c_all
0 00008ef3 _cpu_timer1_isr_PULT
0 00008ab4 _cpu_timer1_isr_SENS
0 0000abbf _cpu_timer2_isr
0 0000abcb _cpu_timer2_isr
1 0000dac0 _crc_16_tab
0 0000b7ea _create_uart_vars
0 0000add4 _dSEND
0 0000b7f6 _create_uart_vars
0 0000ade0 _dSEND
1 0000dd28 _def_FILTERBAT
1 0000df40 _def_cal
1 0000d8f0 _digits
1 0000d710 _din_count
0 0000b9d7 _epilog_c28x_1
0 0000b9db _epilog_c28x_2
0 0000b8da _er_anal
0 0000b9e4 _epilog_c28x_1
0 0000b9e8 _epilog_c28x_2
0 0000b8e6 _er_anal
1 0000dd3a _err_count
1 0000e063 _errno
0 0000b851 _exit
0 0000b85d _exit
1 0000e034 _ext_diag
1 0000e040 _ext_temp
0 00009f39 _extendbios
0 0000ae34 _filterbat
0 00009f45 _extendbios
0 0000ae40 _filterbat
1 0000dc41 _flag_DEBUG
1 0000de8a _flog
0 00008784 _get_Buttons
0 000085db _get_Buttons
0 00009281 _get_Mode
0 0000a420 _get_command
0 0000af94 _get_crc16
0 0000b93b _get_crc_16
0 0000aeea _get_crc_16b
0 0000b179 _im_calc
0 00009fbd _init
0 0000aa96 _init_zone7
0 0000a76e _initload
0 0000a42c _get_command
0 0000afa0 _get_crc16
0 0000b959 _get_crc_16
0 0000aef6 _get_crc_16b
0 0000b185 _im_calc
0 00009fc9 _init
0 0000aaa2 _init_zone7
0 0000a77a _initload
1 0000e030 _isMask
1 0000e02a _isNumb
0 00009396 _kanal_Send
1 0000e050 _lev_count
1 0000dff0 _lev_quadr
0 0000a6dd _load
0 0000a6e9 _load
1 00200000 _logs_block
1 0000e05f _low_count
0 000085de _main
0 0000badf _memset
0 00008781 _main
0 0000baec _memset
1 0000dbc0 _modbus
1 0000de89 _never_write
1 0000de88 _no_write
1 0000dd13 _okay
1 0000d900 _out_filter
1 0000dc80 _param
0 0000b95e _pause_us
0 0000a0c3 _peek
0 0000b96b _pause_us
0 0000a0cf _peek
1 0000dd0a _period_blink
1 0000dea8 _period_dac
1 0000dd09 _period_ready
0 0000ab85 _poke
0 0000ab91 _poke
1 0000e018 _powK
1 0000dd08 _pow_addr
1 0000df22 _prev_ok
0 0000b868 _prolog_c28x_1
0 0000b86c _prolog_c28x_2
0 0000b874 _prolog_c28x_3
0 0000b874 _prolog_c28x_1
0 0000b878 _prolog_c28x_2
0 0000b880 _prolog_c28x_3
1 0000e02b _quaLamp
1 0000e056 _readr
0 0000b0c9 _reset_errs
0 0000b0d5 _reset_errs
1 0000d040 _rs_a
1 0000d3c0 _rs_b
0 0000bab2 _rsvd_ISR
0 0000ac9f _run
0 0000b003 _select_tpl_255
0 00009abd _select_tpl_canal
0 0000babf _rsvd_ISR
0 0000acab _run
0 0000b00f _select_tpl_255
0 00009ac9 _select_tpl_canal
1 0000dc42 _sens_count
1 0000dfc0 _sens_pair
1 0000dfd8 _sens_type
0 0000baf0 _set_cntrl_addr
0 0000bafd _set_cntrl_addr
0 00008927 _setup_adc
0 0000a9d7 _setup_arr_cmd_length
0 0000b027 _setup_leds_line
0 0000a9e3 _setup_arr_cmd_length
0 0000b033 _setup_leds_line
0 00009686 _setup_uart
1 0000dd0c _sig
0 0000b08a _sqrt
0 0000bafc _tflash
0 0000b096 _sqrt
0 0000bb09 _tflash
1 0000dd0d _time_1_5sec
1 0000dd0f _time_3sec
1 0000dd0e _time_5msec
1 0000dd10 _time_5sec
1 0000dea9 _time_dac
0 0000aebd _timer_Init
0 0000aec9 _timer_Init
1 0000dd06 _tpl_cans
0 0000ab4a _ump_can_fragment
0 0000b195 _ump_crc
0 0000a913 _ump_log_can
0 0000b106 _ump_log_init
0 0000ae62 _ump_log_io
0 0000976b _ump_log_read
0 0000ba88 _ump_log_rs
0 0000b881 _ump_log_tick
0 0000a21e _ump_log_write
0 0000a5b2 _ump_prepare
0 00009fbe _ump_rtu_encode
0 0000b1b1 _ump_tms28335_capture
0 0000ac30 _ump_tms28335_fragment
0 0000b123 _ump_tms28335_prepare
0 0000a1ad _ump_validate
0 0000ada2 _unsetup_leds_line
0 00009b59 _upload
0 0000ab56 _ump_can_fragment
0 0000b1a1 _ump_crc
0 0000a91f _ump_log_can
0 0000b112 _ump_log_init
0 0000ae6e _ump_log_io
0 00009823 _ump_log_read
0 0000ba95 _ump_log_rs
0 0000b88d _ump_log_tick
0 0000a22a _ump_log_write
0 0000a5be _ump_prepare
0 00009fca _ump_rtu_encode
0 0000b1bd _ump_tms28335_capture
0 0000ac3c _ump_tms28335_fragment
0 0000b12f _ump_tms28335_prepare
0 0000a1b9 _ump_validate
0 0000adae _unsetup_leds_line
0 00009b65 _upload
1 0000e001 _wait
0 0000b140 _what_is
0 0000b14c _what_is
1 0000e048 _zer_count
1 0000de40 _zer_filter
abs ffffffff binit
0 0000c000 cinit
0 0000bafd etext
0 0000bb0a etext
abs ffffffff pinit
@@ -1360,10 +1360,10 @@ page address name
0 00008000 .text
0 00008000 _Current_count
0 00008000 ___text__
0 0000825a _adc_isr
0 00008437 _Temper_count
0 000085de _main
0 00008784 _get_Buttons
0 00008257 _adc_isr
0 00008434 _Temper_count
0 000085db _get_Buttons
0 00008781 _main
0 00008927 _setup_adc
0 00008ab4 _cpu_timer1_isr_SENS
0 00008c38 _RS_RX_Handler
@@ -1376,212 +1376,212 @@ page address name
0 000094a1 _Power_count
0 0000959a _Default_params
0 00009686 _setup_uart
0 0000976b _ump_log_read
0 0000981e _calc_sensor_koef
0 000098cc _InitCan
0 00009978 _UMP_CAN_service
0 00009a20 _ReceiveCommandModbus3
0 00009abd _select_tpl_canal
0 00009b59 _upload
0 00009bf0 _Init_packMask
0 00009e2c FS$$DIV
0 00009eb4 _InitPeripheralClocks
0 00009f39 _extendbios
0 00009fbd _init
0 00009fbe _ump_rtu_encode
0 0000a041 _InitPll
0 0000a0c3 _peek
0 0000a13b _Handlai
0 0000a1ad _ump_validate
0 0000a21e _ump_log_write
0 0000a28e _RS_TX_Handler
0 0000a2fc _Load_protection_prepare
0 0000a365 _Init_sensors_more
0 0000a3c7 _InitXintf16Gpio
0 0000a420 _get_command
0 0000a477 _ReceiveCommandModbus6
0 0000a5b2 _ump_prepare
0 0000a5ff _RS_Send
0 0000a64a _CANa_handler
0 0000a6dd _load
0 0000a726 _CAN_send
0 0000a76e _initload
0 0000a7b5 _RSA_RX_Handler
0 0000a7fb _RSA_TX_Handler
0 0000a841 _RSB_RX_Handler
0 0000a887 _RSB_TX_Handler
0 0000a8cd _c_int00
0 0000a913 _ump_log_can
0 0000a955 _Seeprom_read
0 0000a996 _Seeprom_write
0 0000a9d7 _setup_arr_cmd_length
0 0000aa18 _Load_params
0 0000aa58 _RS_SetLineSpeed
0 0000aa96 _init_zone7
0 0000aad4 _InitCpuTimers
0 0000ab0f _Load_voltage_can
0 0000ab4a _ump_can_fragment
0 0000ab85 _poke
0 0000abbf _cpu_timer2_isr
0 0000abf8 _SendCommandModbus4
0 0000ac30 _ump_tms28335_fragment
0 0000ac68 _RS_BSend
0 0000ac9f _run
0 0000aca0 _ReceiveAnswerModbus4
0 0000acd7 _Answer
0 0000ad70 _SPISE2P_DRV_init
0 0000ada2 _unsetup_leds_line
0 0000add4 _dSEND
0 0000ae05 _RS_FifoTick1ms
0 0000ae34 _filterbat
0 0000ae62 _ump_log_io
0 0000ae90 _RS_SetLineMode
0 0000aebd _timer_Init
0 0000aeea _get_crc_16b
0 0000af16 _CANa_reset_err
0 0000af41 L$$DIV
0 0000af50 L$$MOD
0 0000af5e UL$$DIV
0 0000af65 UL$$MOD
0 0000af6b _InitSeeprom
0 0000af94 _get_crc16
0 0000afbb _Save_params
0 0000b003 _select_tpl_255
0 0000b027 _setup_leds_line
0 0000b049 _ConfigCpuTimer
0 0000b06a _Setup_DAC_time
0 0000b08a _sqrt
0 0000b0aa _InitPieCtrl
0 0000b0c9 _reset_errs
0 0000b0e8 _Load_control_init
0 0000b106 _ump_log_init
0 0000b123 _ump_tms28335_prepare
0 0000b140 _what_is
0 0000b15d _Init_DAC
0 0000b179 _im_calc
0 0000b195 _ump_crc
0 0000b1b1 _ump_tms28335_capture
0 0000b1cd _ADCINT_ISR
0 0000b1e8 _DINTCH1_ISR
0 0000b203 _DINTCH2_ISR
0 0000b21e _DINTCH3_ISR
0 0000b239 _DINTCH4_ISR
0 0000b254 _DINTCH5_ISR
0 0000b26f _DINTCH6_ISR
0 0000b28a _ECAN0INTA_ISR
0 0000b2a5 _ECAN0INTB_ISR
0 0000b2c0 _ECAN1INTA_ISR
0 0000b2db _ECAN1INTB_ISR
0 0000b2f6 _ECAP1_INT_ISR
0 0000b311 _ECAP2_INT_ISR
0 0000b32c _ECAP3_INT_ISR
0 0000b347 _ECAP4_INT_ISR
0 0000b362 _ECAP5_INT_ISR
0 0000b37d _ECAP6_INT_ISR
0 0000b398 _EPWM1_INT_ISR
0 0000b3b3 _EPWM1_TZINT_ISR
0 0000b3ce _EPWM2_INT_ISR
0 0000b3e9 _EPWM2_TZINT_ISR
0 0000b404 _EPWM3_INT_ISR
0 0000b41f _EPWM3_TZINT_ISR
0 0000b43a _EPWM4_INT_ISR
0 0000b455 _EPWM4_TZINT_ISR
0 0000b470 _EPWM5_INT_ISR
0 0000b48b _EPWM5_TZINT_ISR
0 0000b4a6 _EPWM6_INT_ISR
0 0000b4c1 _EPWM6_TZINT_ISR
0 0000b4dc _EQEP1_INT_ISR
0 0000b4f7 _EQEP2_INT_ISR
0 0000b512 _I2CINT1A_ISR
0 0000b52d _I2CINT2A_ISR
0 0000b548 _LUF_ISR
0 0000b563 _LVF_ISR
0 0000b57e _MRINTA_ISR
0 0000b599 _MRINTB_ISR
0 0000b5b4 _MXINTA_ISR
0 0000b5cf _MXINTB_ISR
0 0000b5ea _SCIRXINTA_ISR
0 0000b605 _SCIRXINTB_ISR
0 0000b620 _SCIRXINTC_ISR
0 0000b63b _SCITXINTA_ISR
0 0000b656 _SCITXINTB_ISR
0 0000b671 _SCITXINTC_ISR
0 0000b68c _SEQ1INT_ISR
0 0000b6a7 _SEQ2INT_ISR
0 0000b6c2 _SPIRXINTA_ISR
0 0000b6dd _SPITXINTA_ISR
0 0000b6f8 _TINT0_ISR
0 0000b713 _WAKEINT_ISR
0 0000b72e _XINT3_ISR
0 0000b749 _XINT4_ISR
0 0000b764 _XINT5_ISR
0 0000b77f _XINT6_ISR
0 0000b79a _XINT7_ISR
0 0000b7b5 __args_main
0 0000b7d0 _RS_SetBitMode
0 0000b7ea _create_uart_vars
0 0000b804 _InitAdc
0 0000b81d _XINT1_ISR
0 0000b836 _XINT2_ISR
0 0000b84f C$$EXIT
0 0000b84f _abort
0 0000b851 _exit
0 0000b868 _prolog_c28x_1
0 0000b86c _prolog_c28x_2
0 0000b874 _prolog_c28x_3
0 0000b881 _ump_log_tick
0 0000b899 _clear_mem
0 0000b8b0 _ServiceDog
0 0000b8da _er_anal
0 0000b902 _RESET
0 0000b915 _RS_FifoWait
0 0000b93b _get_crc_16
0 0000b94d _SENDBIT
0 0000b95e _pause_us
0 0000b97e _DATALOG_ISR
0 0000b98b _INT13_ISR
0 0000b998 _INT14_ISR
0 0000b9a5 _InitPieVectTable
0 0000b9b2 _RTOSINT_ISR
0 0000b9bf _DCLK
0 0000b9cb _DOUT
0 0000b9d7 _epilog_c28x_1
0 0000b9db _epilog_c28x_2
0 0000b9e3 _EMUINT_ISR
0 0000b9ee _ILLEGAL_ISR
0 0000b9f9 _NMI_ISR
0 0000ba04 _USER10_ISR
0 0000ba0f _USER11_ISR
0 0000ba1a _USER12_ISR
0 0000ba25 _USER1_ISR
0 0000ba30 _USER2_ISR
0 0000ba3b _USER3_ISR
0 0000ba46 _USER4_ISR
0 0000ba51 _USER5_ISR
0 0000ba5c _USER6_ISR
0 0000ba67 _USER7_ISR
0 0000ba72 _USER8_ISR
0 0000ba7d _USER9_ISR
0 0000ba88 _ump_log_rs
0 0000ba93 U$$DIV
0 0000ba98 U$$MOD
0 0000ba9e _INT_NOTUSED_ISR
0 0000baa8 _PIE_RESERVED
0 0000bab2 _rsvd_ISR
0 0000babc _EnableInterrupts
0 0000bac5 _InitSysCtrl
0 0000bace __register_unlock
0 0000bad2 __register_lock
0 0000bad6 __nop
0 0000bad7 _DisableDog
0 0000badf _memset
0 0000bae6 _SPISE2P_DRV_csclr
0 0000baeb _SPISE2P_DRV_csset
0 0000baf0 _set_cntrl_addr
0 0000baf5 _DSP28x_usDelay
0 0000bafc _tflash
0 0000bafd ___etext__
0 0000bafd etext
0 0000976b _InitCan
0 00009823 _ump_log_read
0 000098d6 _calc_sensor_koef
0 00009984 _UMP_CAN_service
0 00009a2c _ReceiveCommandModbus3
0 00009ac9 _select_tpl_canal
0 00009b65 _upload
0 00009bfc _Init_packMask
0 00009e38 FS$$DIV
0 00009ec0 _InitPeripheralClocks
0 00009f45 _extendbios
0 00009fc9 _init
0 00009fca _ump_rtu_encode
0 0000a04d _InitPll
0 0000a0cf _peek
0 0000a147 _Handlai
0 0000a1b9 _ump_validate
0 0000a22a _ump_log_write
0 0000a29a _RS_TX_Handler
0 0000a308 _Load_protection_prepare
0 0000a371 _Init_sensors_more
0 0000a3d3 _InitXintf16Gpio
0 0000a42c _get_command
0 0000a483 _ReceiveCommandModbus6
0 0000a5be _ump_prepare
0 0000a60b _RS_Send
0 0000a656 _CANa_handler
0 0000a6e9 _load
0 0000a732 _CAN_send
0 0000a77a _initload
0 0000a7c1 _RSA_RX_Handler
0 0000a807 _RSA_TX_Handler
0 0000a84d _RSB_RX_Handler
0 0000a893 _RSB_TX_Handler
0 0000a8d9 _c_int00
0 0000a91f _ump_log_can
0 0000a961 _Seeprom_read
0 0000a9a2 _Seeprom_write
0 0000a9e3 _setup_arr_cmd_length
0 0000aa24 _Load_params
0 0000aa64 _RS_SetLineSpeed
0 0000aaa2 _init_zone7
0 0000aae0 _InitCpuTimers
0 0000ab1b _Load_voltage_can
0 0000ab56 _ump_can_fragment
0 0000ab91 _poke
0 0000abcb _cpu_timer2_isr
0 0000ac04 _SendCommandModbus4
0 0000ac3c _ump_tms28335_fragment
0 0000ac74 _RS_BSend
0 0000acab _run
0 0000acac _ReceiveAnswerModbus4
0 0000ace3 _Answer
0 0000ad7c _SPISE2P_DRV_init
0 0000adae _unsetup_leds_line
0 0000ade0 _dSEND
0 0000ae11 _RS_FifoTick1ms
0 0000ae40 _filterbat
0 0000ae6e _ump_log_io
0 0000ae9c _RS_SetLineMode
0 0000aec9 _timer_Init
0 0000aef6 _get_crc_16b
0 0000af22 _CANa_reset_err
0 0000af4d L$$DIV
0 0000af5c L$$MOD
0 0000af6a UL$$DIV
0 0000af71 UL$$MOD
0 0000af77 _InitSeeprom
0 0000afa0 _get_crc16
0 0000afc7 _Save_params
0 0000b00f _select_tpl_255
0 0000b033 _setup_leds_line
0 0000b055 _ConfigCpuTimer
0 0000b076 _Setup_DAC_time
0 0000b096 _sqrt
0 0000b0b6 _InitPieCtrl
0 0000b0d5 _reset_errs
0 0000b0f4 _Load_control_init
0 0000b112 _ump_log_init
0 0000b12f _ump_tms28335_prepare
0 0000b14c _what_is
0 0000b169 _Init_DAC
0 0000b185 _im_calc
0 0000b1a1 _ump_crc
0 0000b1bd _ump_tms28335_capture
0 0000b1d9 _ADCINT_ISR
0 0000b1f4 _DINTCH1_ISR
0 0000b20f _DINTCH2_ISR
0 0000b22a _DINTCH3_ISR
0 0000b245 _DINTCH4_ISR
0 0000b260 _DINTCH5_ISR
0 0000b27b _DINTCH6_ISR
0 0000b296 _ECAN0INTA_ISR
0 0000b2b1 _ECAN0INTB_ISR
0 0000b2cc _ECAN1INTA_ISR
0 0000b2e7 _ECAN1INTB_ISR
0 0000b302 _ECAP1_INT_ISR
0 0000b31d _ECAP2_INT_ISR
0 0000b338 _ECAP3_INT_ISR
0 0000b353 _ECAP4_INT_ISR
0 0000b36e _ECAP5_INT_ISR
0 0000b389 _ECAP6_INT_ISR
0 0000b3a4 _EPWM1_INT_ISR
0 0000b3bf _EPWM1_TZINT_ISR
0 0000b3da _EPWM2_INT_ISR
0 0000b3f5 _EPWM2_TZINT_ISR
0 0000b410 _EPWM3_INT_ISR
0 0000b42b _EPWM3_TZINT_ISR
0 0000b446 _EPWM4_INT_ISR
0 0000b461 _EPWM4_TZINT_ISR
0 0000b47c _EPWM5_INT_ISR
0 0000b497 _EPWM5_TZINT_ISR
0 0000b4b2 _EPWM6_INT_ISR
0 0000b4cd _EPWM6_TZINT_ISR
0 0000b4e8 _EQEP1_INT_ISR
0 0000b503 _EQEP2_INT_ISR
0 0000b51e _I2CINT1A_ISR
0 0000b539 _I2CINT2A_ISR
0 0000b554 _LUF_ISR
0 0000b56f _LVF_ISR
0 0000b58a _MRINTA_ISR
0 0000b5a5 _MRINTB_ISR
0 0000b5c0 _MXINTA_ISR
0 0000b5db _MXINTB_ISR
0 0000b5f6 _SCIRXINTA_ISR
0 0000b611 _SCIRXINTB_ISR
0 0000b62c _SCIRXINTC_ISR
0 0000b647 _SCITXINTA_ISR
0 0000b662 _SCITXINTB_ISR
0 0000b67d _SCITXINTC_ISR
0 0000b698 _SEQ1INT_ISR
0 0000b6b3 _SEQ2INT_ISR
0 0000b6ce _SPIRXINTA_ISR
0 0000b6e9 _SPITXINTA_ISR
0 0000b704 _TINT0_ISR
0 0000b71f _WAKEINT_ISR
0 0000b73a _XINT3_ISR
0 0000b755 _XINT4_ISR
0 0000b770 _XINT5_ISR
0 0000b78b _XINT6_ISR
0 0000b7a6 _XINT7_ISR
0 0000b7c1 __args_main
0 0000b7dc _RS_SetBitMode
0 0000b7f6 _create_uart_vars
0 0000b810 _InitAdc
0 0000b829 _XINT1_ISR
0 0000b842 _XINT2_ISR
0 0000b85b C$$EXIT
0 0000b85b _abort
0 0000b85d _exit
0 0000b874 _prolog_c28x_1
0 0000b878 _prolog_c28x_2
0 0000b880 _prolog_c28x_3
0 0000b88d _ump_log_tick
0 0000b8a5 _clear_mem
0 0000b8bc _ServiceDog
0 0000b8e6 _er_anal
0 0000b90e _RESET
0 0000b921 _RS_FifoWait
0 0000b947 _SENDBIT
0 0000b959 _get_crc_16
0 0000b96b _pause_us
0 0000b98b _DATALOG_ISR
0 0000b998 _INT13_ISR
0 0000b9a5 _INT14_ISR
0 0000b9b2 _InitPieVectTable
0 0000b9bf _RTOSINT_ISR
0 0000b9cc _DCLK
0 0000b9d8 _DOUT
0 0000b9e4 _epilog_c28x_1
0 0000b9e8 _epilog_c28x_2
0 0000b9f0 _EMUINT_ISR
0 0000b9fb _ILLEGAL_ISR
0 0000ba06 _NMI_ISR
0 0000ba11 _USER10_ISR
0 0000ba1c _USER11_ISR
0 0000ba27 _USER12_ISR
0 0000ba32 _USER1_ISR
0 0000ba3d _USER2_ISR
0 0000ba48 _USER3_ISR
0 0000ba53 _USER4_ISR
0 0000ba5e _USER5_ISR
0 0000ba69 _USER6_ISR
0 0000ba74 _USER7_ISR
0 0000ba7f _USER8_ISR
0 0000ba8a _USER9_ISR
0 0000ba95 _ump_log_rs
0 0000baa0 U$$DIV
0 0000baa5 U$$MOD
0 0000baab _INT_NOTUSED_ISR
0 0000bab5 _PIE_RESERVED
0 0000babf _rsvd_ISR
0 0000bac9 _EnableInterrupts
0 0000bad2 _InitSysCtrl
0 0000badb __register_unlock
0 0000badf __register_lock
0 0000bae3 __nop
0 0000bae4 _DisableDog
0 0000baec _memset
0 0000baf3 _SPISE2P_DRV_csclr
0 0000baf8 _SPISE2P_DRV_csset
0 0000bafd _set_cntrl_addr
0 0000bb02 _DSP28x_usDelay
0 0000bb09 _tflash
0 0000bb0a ___etext__
0 0000bb0a etext
0 0000c000 _RamfuncsLoadEnd
0 0000c000 _RamfuncsLoadStart
0 0000c000 _RamfuncsRunStart

View File

@@ -0,0 +1,90 @@
/* Модель проверяет выбор фаз и диагностику на заданных установившихся RMS, а не точность аналогового тракта. */
#include <math.h> /* Даёт настоящим im_calc и Current_count вычисление квадратного корня. */
#include <stdio.h> /* Выводит имя сценария и конкретное условие при регрессии. */
#include <string.h> /* Обнуляет независимое состояние перед каждым сценарием. */
#define interrupt /* Убирает аппаратный атрибут ISR из включаемого production-заголовка на хосте. */
typedef float FILTERBAT; /* Заменяет состояние внешнего сглаживающего фильтра: его динамика не относится к выбору пар фаз. */
#include "measure.h" /* Использует реальные ERROR, FLAG, частоту АЦП, маски ошибок и коды типов датчиков. */
#include "package.h" /* Использует реальные типы плат, смещения COMM и адреса технологических регистров. */
int modbus[129], Desk, pow_addr, Curr_Edge; /* Предоставляет штатное регистровое пространство и выбранную конфигурацию измерений. */
int sens_type[24], sens_pair[24], lev_count[6], adc_table_lem[4]; /* Сохраняет production-размеры глобальных датчиков и локальных массивов двух трёхфазных вводов. */
float lev_quadr[6], zer_count[4], powK[4]; /* Содержит RMS-накопители, нулевые уровни и коэффициенты физических каналов. */
FILTERBAT out_filter[24], zer_filter[4]; /* Предоставляет ячейки фильтров по тем же индексам, что в Current_count. */
unsigned int err_count[6], low_count[2], time_3sec; /* Сохраняет настоящие счётчики выдержки фазных ошибок и пониженного напряжения. */
long WAKE, WAKE_TIME; /* Позволяет запускать диагностику после завершения начальной паузы прошивки. */
FLAG chk, sig; /* Предоставляет реальные агрегированные диагностические флаги для reset_errs. */
static int failures; /* Накапливает ошибки всех сценариев, чтобы мутация проверяла сразу передачу и диагностику. */
static float filterbat(FILTERBAT *state, float value) /* Пропускает заданное значение через заглушку внешнего фильтра без изменения исследуемых RMS-накопителей. */
{ /* Ограничивает заглушку сглаживания, используемую только вне проверяемого выбора пар. */
(void)state; /* Состояние фильтра не влияет на сценарии с заданными установившимися RMS. */
return value; /* Сохраняет нулевой уровень и амплитуду без дополнительной динамики. */
} /* Завершает единственную заглушку математического окружения. */
/* HANDLERS */
static void check(int condition, const char *what, const char *scenario) /* Записывает конкретную регрессию, продолжая проверку остальных требований. */
{ /* Начинает обработку одного ожидаемого поведения. */
if (!condition) { /* Не засоряет вывод успешными отдельными сравнениями. */
printf("FAIL %s: %s\n", what, scenario); /* Имена Modbus и Wry позволяют мутационному запуску различать два последствия ошибки. */
failures++; /* Делает итоговый код завершения ненулевым при любой неудаче. */
} /* Заканчивает регистрацию нарушенного условия. */
} /* Завершает независимую проверку одного свойства. */
static void run_case(int desk, int feed, int ignore, const char *name) /* Проверяет выбранный ввод; feed=-1 задаёт симметрию без перекоса. */
{ /* Создаёт полностью независимый сценарий COMM или LOAD. */
int targets[6] = {360, 360, 360, 360, 360, 360}; /* Задаёт симметрию выше порогов COMM200 и LOAD300; третьи фазы расположены в ячейках4 и5. */
int i, tick, local, base, expected_wry, previous = failures; /* Хранит индексы каналов, адрес регистра и число ошибок до сценария. */
memset(modbus, 0, sizeof(modbus)); /* Убирает старые данные и флаги, в том числе Bypas, между сценариями. */
memset(err_count, 0, sizeof(err_count)); /* Начинает выдержку перекоса с нуля, чтобы проверить её реальное накопление. */
memset(low_count, 0, sizeof(low_count)); /* Исключает влияние предыдущей проверки защиты LOAD по нижнему порогу. */
memset(zer_count, 0, sizeof(zer_count)); /* Согласует средний уровень АЦП с нулевыми входными отсчётами. */
memset(adc_table_lem, 0, sizeof(adc_table_lem)); /* Нулевые мгновенные отсчёты позволяют точно задать RMS через состояние фильтра. */
Desk = desk; /* Выбирает настоящую ветку обработки полярности COMM или защиты LOAD. */
pow_addr = desk == dsk_COMM ? TPL_POW * 2 + OWEN_DT : 0; /* Получает глобальное смещение16 для COMM из production-констант и нулевое для LOAD. */
Curr_Edge = desk == dsk_COMM ? 200 : 300; /* Повторяет штатный порог включения контроля перекоса в единицах измеряемой величины. */
time_3sec = 3 * ADC_FREQ; /* Сохраняет настоящую выдержку: три секунды при частоте из measure.h. */
WAKE = WAKE_TIME = 0; /* Снимает стартовую блокировку диагностики и обновления измеренных значений. */
chk.all = sig.all = 0; /* Убирает агрегированные флаги предыдущего сценария. */
for (i = 0; i < 24; i++) { /* Готовит именно глобальную таблицу датчиков, на которой проявлялась ошибка COMM. */
sens_pair[i] = i; /* Оставляет температурным позициям пары с самими собой, как Init_sensors. */
sens_type[i] = VOLTAGE; /* Выбирает ветку напряжения, не затрагивая управление током нагрузки. */
} /* Завершает подготовку глобального пространства датчиков. */
for (i = 0; i < 4; i++) { /* Настраивает четыре физических канала двух вводов. */
sens_pair[pow_addr + i] = pow_addr + (i ^ 1); /* Создаёт штатные глобальные пары; мутация ошибочно обратится к температурной области COMM. */
sens_error[pow_addr + i].bit.Ignor = ignore; /* Проверяет как разрешённый Stop, так и штатное для COMM игнорирование остановки. */
sens_hi_edge[pow_addr + i] = 1000; /* Не допускает посторонней защиты LOAD по верхнему порогу в этих фазных сценариях. */
powK[i] = 1.0f; /* Нулевой отсчёт после вычитания нуля должен давать нулевое мгновенное значение. */
} /* Завершает подготовку физических каналов и их диагностических режимов. */
if (feed >= 0) { /* Задаёт перекос только одному вводу, сохраняя второй симметричным. */
targets[feed * 2] = desk == dsk_COMM ? 250 : 500; /* Первая фаза превышает соответствующий порог включения диагностики. */
targets[feed * 2 + 1] = desk == dsk_COMM ? 149 : 299; /* Вторая фаза ниже порога; историческая ошибка исключала её сравнение с первой. */
targets[4 + feed] = desk == dsk_COMM ? 100 : 200; /* Третья фаза ниже первой на60%, выявляя неверное накопление общего счётчика. */
} /* Завершает выбор контрольных RMS для одного перекошенного ввода. */
for (tick = 0; tick < time_3sec + 2; tick++) { /* Даёт каждому физическому каналу пройти полную выдержку er_anal, включая проверку достижения порога. */
for (i = 0; i < 6; i++) { /* Фиксирует установившиеся RMS отдельно от проверяемой логики пар и счётчиков. */
float rms = targets[i] + 0.25f; /* Запас четверть единицы исключает случайную потерю единицы при округлении float в int. */
lev_count[i] = targets[i]; /* Задаёт значения ещё не обработанных в текущем проходе каналов, как на установившемся сигнале. */
lev_quadr[i] = rms * rms * ADC_FREQ / (ADC_FREQ - 1.0f); /* Компенсирует один шаг экспоненциального RMS-фильтра при нулевом мгновенном отсчёте. */
} /* Завершает подготовку всех шести RMS без вмешательства в диагностические счётчики. */
for (i = 0; i < 4; i++) Current_count(i); /* Повторяет реальный порядок вызовов из ADC.c, включая общий счётчик третьей фазы. */
} /* Завершает выдержку на настоящей production-диагностике. */
for (i = 0; i < 2; i++) { /* Проверяет оба ввода, в том числе отсутствие взаимного влияния их данных. */
local = i * 2; /* Переводит номер ввода в первый из двух физических каналов. */
base = 0x68 + i * 3; /* Адресует штатную тройку фаз:0x68–0x6A или0x6B–0x6D. */
check(modbus[base] == targets[local] && modbus[base + 1] == targets[local + 1] && modbus[base + 2] == targets[4 + i], "Modbus phases", name); /* Требует передачу A/B/C без подмены первой фазы второй. */
expected_wry = i == feed; /* Только выбранный перекошенный ввод должен получить диагностику Wry. */
check(sens_error[pow_addr + local + 1].bit.Wry == expected_wry, "Wry phase B", name); /* Проверяет восстановление сравнения второй фазы с действительным максимумом. */
check(sens_error[pow_addr + local].bit.Wry == expected_wry, "Wry phase C", name); /* Проверяет общий счётчик третьей фазы, который исторически чередовал увеличение и уменьшение. */
check(sens_error[pow_addr + local + 1].bit.Stop == (expected_wry && !ignore), "Stop respects Ignor", name); /* Разделяет диагностику перекоса и разрешение остановки. */
} /* Завершает проверки обоих вводов после выдержки. */
if (failures == previous) printf("PASS %s\n", name); /* Показывает полное прохождение сценария только при выполнении всех ожиданий. */
} /* Завершает один сценарий со сброшенным и затем выдержанным состоянием. */
int main(void) /* Объединяет адресацию обоих вводов, два режима Ignor, симметрию и регрессию LOAD. */
{ /* Запускает одинаковый набор сценариев для production и временной исторической мутации. */
run_case(dsk_COMM, 0, 0, "COMM feed 1: 250/149/100, Ignor=0"); /* Проверяет первую тройку регистров и разрешённый Stop. */
run_case(dsk_COMM, 1, 0, "COMM feed 2: 250/149/100, Ignor=0"); /* Проверяет вторую тройку без подмены данных между вводами. */
run_case(dsk_COMM, 0, 1, "COMM feed 1: 250/149/100, Ignor=1"); /* Требует Wry при выключенной реакции Stop для первого ввода. */
run_case(dsk_COMM, 1, 1, "COMM feed 2: 250/149/100, Ignor=1"); /* Требует такую же независимость Wry от Ignor на втором вводе. */
run_case(dsk_COMM, -1, 0, "COMM symmetric: 360/360/360"); /* Исключает ложный перекос при симметрии выше порога диагностики. */
run_case(dsk_LOAD, 0, 0, "LOAD feed 1: 500/299/200, pow_addr=0"); /* Проверяет сохранение штатных локальных пар LOAD и его порога300. */
run_case(dsk_LOAD, 1, 0, "LOAD feed 2: 500/299/200, pow_addr=0"); /* Проверяет вторую пару LOAD при нулевом глобальном смещении. */
run_case(dsk_LOAD, -1, 0, "LOAD symmetric: 360/360/360"); /* Исключает ложное срабатывание LOAD на симметрии выше его порога. */
return failures ? 1 : 0; /* Сообщает вызывающему Python о любом нарушении проверяемого поведения. */
} /* Завершает исполняемую модель без записи файлов или изменения прошивки. */

View File

@@ -0,0 +1,44 @@
# Проверяет передачу фаз и диагностику на настоящих функциях measure.c без аппаратуры C28x.
import argparse # Принимает путь к компилятору хостовой модели, не привязывая тест к одной машине.
import os # Добавляет каталог компилятора в PATH для запуска его вспомогательных программ.
from pathlib import Path # Разрешает пути относительно теста независимо от рабочего каталога.
import re # Находит границы функций и единственное место исторической мутации.
import subprocess # Компилирует модель и проверяет коды завершения исполняемых проверок.
import tempfile # Размещает сгенерированный C и исполняемые файлы вне исходного дерева.
ROOT = Path(__file__).resolve().parents[2] # Поднимается от tests/current_measure к корню репозитория.
SOURCE = ROOT / "Source/Internal/measure.c" # Выбирает текущую production-реализацию измерений.
def extract(source, name): # Извлекает одну настоящую функцию, чтобы тест не содержал копию алгоритма.
match = re.search(r"(?:void|int|float)\s+" + name + r"\([^;{}]*\)\s*\{", source) # Отличает определение от прототипа и вызовов.
assert match is not None, name # Явно завершает тест, если production-функция исчезла или сменила форму.
end = source.index("{", match.start()) + 1 # Начинает подсчёт вложенности сразу после открывающей скобки.
depth = 1 # Учитывает уже найденный внешний блок функции.
while depth: # Читает определение целиком вместе с вложенными условиями.
depth += (source[end] == "{") - (source[end] == "}") # Находит соответствующую закрывающую скобку без обрезки вложенных блоков.
end += 1 # Включает последнюю обработанную скобку в извлекаемый диапазон.
return source[match.start():end] # Возвращает production-код без изменения его вычислений.
parser = argparse.ArgumentParser(description="Проверка фаз COMM и LOAD на хосте") # Описывает назначение самостоятельного запуска.
parser.add_argument("--cc", required=True, help="Путь к GCC") # Позволяет выбрать доступный C-компилятор без изменения теста.
args = parser.parse_args() # Разбирает аргументы до создания временных файлов.
source = re.sub(r"/\*.*?\*/|//[^\n]*", "", SOURCE.read_text(encoding="utf-8"), flags=re.S) # Убирает комментарии с примерами скобок, сохраняя исполняемый код.
body = "\n".join(extract(source, name) for name in ("im_calc", "er_anal", "reset_errs", "Current_count")) # Включает реальные расчёты, накопление ошибки и запись диагностических флагов.
before, after = Path(__file__).with_name("model.inc").read_text(encoding="utf-8").split("/* HANDLERS */") # Вставляет production-функции между моделью окружения и сценариями.
legacy, replacements = re.subn(r"\bpair\s*=\s*chan\s*\^\s*1\s*;", "pair = sens_pair[chan];", body) # Возвращает старую ошибку только во временную мутационную сборку.
assert replacements == 1, "Не найдено единственное место выбора пары фаз" # Не допускает фиктивной мутационной проверки неизменённого кода.
environment = dict(os.environ) # Сохраняет окружение вызывающего процесса для компилятора.
environment["PATH"] = str(Path(args.cc).resolve().parent) + os.pathsep + environment.get("PATH", "") # Делает библиотеки и вспомогательные программы GCC доступными дочерним процессам.
with tempfile.TemporaryDirectory(prefix="current-measure-") as directory: # Автоматически удаляет только временные артефакты этого запуска.
for name, functions in (("production", body), ("legacy", legacy)): # Прогоняет одинаковые поведенческие сценарии на исправлении и исторической ошибке.
c_path = Path(directory) / (name + ".c") # Разделяет исходники двух сборок для однозначных диагностик компилятора.
exe_path = Path(directory) / (name + ".exe") # Даёт каждой модели собственный исполняемый файл.
c_path.write_text(before + functions + after, encoding="utf-8") # Сохраняет временный C с русскими пояснениями в UTF-8.
subprocess.run([args.cc, "-std=c99", "-O3", "-fno-strict-aliasing", "-Werror=implicit-function-declaration", "-I", str(ROOT / "Source/Internal/Include"), str(c_path), "-lm", "-o", str(exe_path)], check=True, env=environment) # Компилирует с O3; отключение alias-оптимизации сохраняет production-псевдонимы ERROR поверх Modbus на хосте.
result = subprocess.run([str(exe_path)], capture_output=True, text=True, env=environment, timeout=20) # Ограничивает зависание и сохраняет результат каждого поведенческого сценария.
if name == "production": # Исправленная реализация обязана пройти все проверки без исключений.
print(result.stdout, end="") # Показывает сценарии, успешно проверенные настоящими функциями прошивки.
assert result.returncode == 0, result.stdout + result.stderr # Возвращает сбой запуска при любой регрессии исправленного кода.
else: # Старая строка должна воспроизводимо ломать и значения фаз, и диагностику.
assert result.returncode == 1 and "FAIL Modbus" in result.stdout and "FAIL Wry" in result.stdout, result.stdout + result.stderr # Доказывает чувствительность теста к обоим последствиям именно этой ошибки.
print("PASS mutation: legacy pair rejected by Modbus and Wry checks") # Сообщает об ожидаемом провале временной сборки со старой строкой.

122
tests/testlamp/model.inc Normal file
View File

@@ -0,0 +1,122 @@
/* Проверяет удержание TESTLAMP и выбор пакетов при уже включённых рабочих лампах. */
#include <stdio.h> /* Выводит конкретные нарушенные условия и итог сценария. */
#include <string.h> /* Обнуляет регистровое пространство перед началом проверки. */
#define interrupt /* Убирает аппаратный атрибут ISR при компиляции модели на ПК. */
typedef float FILTERBAT; /* Позволяет подключить production-заголовок с интерфейсами фильтров. */
#include "measure.h" /* Получает настоящие READY_FREQ, BLINK_TIME, CANPOWSE и maximum_bright. */
#include "package.h" /* Получает настоящие адреса TESTLAMP, яркости, ламп и типов плат. */
#include "DSP2833x_SWPrioritizedIsrLevels.h" /* Использует реальную вычисляемую маску приоритетов TI MINT13. */
typedef union { /* Моделирует слово Modbus размером хостового int, сохраняя номера битов production-псевдонимов. */
unsigned int all; /* Обеспечивает запись целого слова по тому же смещению массива. */
struct { /* Размещает шестнадцать технологических битов в младшей части слова. */
unsigned int bit0:1, bit1:1, bit2:1, bit3:1, bit4:1, bit5:1, bit6:1, bit7:1; /* Сохраняет позиции кнопок и команд 0..7. */
unsigned int bit8:1, bit9:1, bitA:1, bitB:1, bitC:1, bitD:1, bitE:1, bitF:1; /* Сохраняет позиции повторителей входов и старших команд 8..15. */
} bit; /* Предоставляет production-псевдонимам доступ к полям регистра. */
} WORDE; /* Завершает хостовое представление одного регистра Modbus. */
struct gpio_bits { /* Предоставляет входы всех ветвей настоящей get_Buttons, без моделирования электрических свойств. */
unsigned GPIO0, GPIO1, GPIO2, GPIO3, GPIO4, GPIO5, GPIO6, GPIO7, GPIO8, GPIO9, GPIO10, GPIO11; /* Представляет дискретные входы нескольких типов плат. */
unsigned GPIO20, GPIO21, GPIO22, GPIO23, GPIO24, GPIO25, GPIO26, GPIO27; /* Представляет перемычки и вход TESTLAMP GPIO26 пульта. */
unsigned GPIO48, GPIO49, GPIO50, GPIO51, GPIO52, GPIO53; /* Представляет входы банка B, читаемые get_Buttons. */
}; /* Завершает перечень моделируемых входов. */
struct gpio_reg { struct gpio_bits bit; }; /* Даёт регистрам GPADAT и GPBDAT production-форму обращения. */
static struct { struct gpio_reg GPADAT, GPBDAT; } GpioDataRegs; /* Хранит управляемые сценарием уровни входов. */
static struct { unsigned long all; } DigErr; /* Принимает диагностическую маску посторонней ветви SHKF. */
static struct { unsigned long InterruptCount; } CpuTimer1; /* Учитывает вызовы настоящего обработчика пульта. */
int modbus[129], Desk; /* Предоставляет технологические регистры и выбирает ветвь пульта. */
unsigned int INcount0, CanPowse, CanGO; /* Хранит production-накопитель кнопки и таймер выдачи CAN. */
unsigned long isMask, Lonely; /* Хранит тестовую маску и возраст последней связи. */
int isNumb, quaLamp = 6; /* Сохраняет тестовые цифры и число ламп из pulto.c. */
static unsigned int IER, mask_at_eint, entry_mask, failures, sends, nested_entries, timer_pending; /* Отслеживает разрешения прерываний, пакетные вызовы и возможность вложенного Timer1. */
static unsigned long lamp_word; /* Запоминает последний пакет шести сигнальных ламп канала 2. */
static long digit_word; /* Сохраняет последнее значение одного из двух семисегментных индикаторов в текущем такте. */
static int digit_dot, digit_sends; /* Запоминает режим форматирования цифр и наличие числового пакета в текущем такте. */
#define M_INT13 0x1000U /* Повторяет бит 12 INT13 из DSP2833x_Device.h для модели регистра IER. */
#define EALLOW ((void)0) /* Не моделирует защиту аппаратных регистров, поскольку она не влияет на рассматриваемые ветви. */
#define EDIS ((void)0) /* Завершает заглушку защищённой записи. */
#define EINT (mask_at_eint = IER) /* Снимает реально применённую маску в момент разрешения вложенных прерываний. */
#define ServiceDog() ((void)0) /* Исключает аппаратный сторожевой таймер из проверки индикации. */
#define toggle_ONLINE() ((void)0) /* Не моделирует электрический сигнал готовности ПЛИС. */
#define toggle_RES_OUT_1() ((void)0) /* Исключает резервный GPIO из логики выбора TESTLAMP. */
#define toggle_RES_OUT_2() ((void)0) /* Исключает второй резервный GPIO из пакетной проверки. */
void cpu_timer1_isr_PULT(void); /* Позволяет заглушке передачи смоделировать повторное аппаратное событие Timer1. */
static void kanal_Send(int adr, long dat, int dot) /* Записывает передаваемые данные, не подменяя проверяемый выбор режима. */
{ /* Начинает обработку одного production-вызова передачи. */
sends++; /* Позволяет обнаружить дополнительные вызовы передачи при повторном входе в ISR. */
if (timer_pending && (IER & M_INT13)) { /* Моделирует новый такт Timer1 во время незаконченной передачи, только когда собственное прерывание ошибочно разрешено. */
timer_pending = 0; /* Ограничивает искусственное событие одним вложенным вызовом. */
nested_entries++; /* Регистрирует перемешивание обработки двух тактов. */
cpu_timer1_isr_PULT(); /* Запускает настоящую production-функцию повторно при неверной маске. */
} /* Завершает моделирование потенциального повторного входа. */
if (adr == 2) lamp_word = (unsigned long)dat; /* Сохраняет именно канал сигнальных ламп, обновляемый в каждом такте. */
if (adr < 2) { /* Записывает также передачу цифр, чтобы обнаружить переход семисегментного индикатора в рабочий режим при провале кнопки. */
digit_word = dat; /* Сохраняет переданное production-функцией числовое значение. */
digit_dot = dot; /* Различает тест четырёх одинаковых цифр и обычное форматирование измерений. */
digit_sends++; /* Отмечает присутствие числового пакета в текущем такте. */
} /* Завершает фиксацию передачи на семисегментный индикатор. */
} /* Завершает заглушку аппаратной передачи. */
/* HANDLERS */
static void check(int condition, const char *name) /* Накапливает ошибки, позволяя проверить все последствия одного дефекта. */
{ /* Начинает регистрацию одного требования. */
if (!condition) { /* Выводит только нарушенные условия. */
printf("FAIL %s\n", name); /* Даёт мутационному тесту устойчивое имя обнаруженного дефекта. */
failures++; /* Делает код завершения ненулевым при любой регрессии. */
} /* Завершает обработку ошибки. */
} /* Завершает проверку одного требования. */
static void tick(void) /* Моделирует сохранение и восстановление IER на границе аппаратного ISR. */
{ /* Начинает один такт индикации. */
IER = entry_mask; /* Возвращает исходные разрешения источников перед новым обработчиком. */
sends = 0; /* Отделяет вызовы передачи текущего такта от предыдущих. */
digit_sends = 0; /* Не принимает пакет предыдущего такта за обновление цифр в текущем. */
cpu_timer1_isr_PULT(); /* Выполняет настоящий алгоритм выбора режима, PWM и пакетов. */
check(mask_at_eint == (entry_mask & MINT13 & ~M_INT13), "interrupt mask"); /* Проверяет отсутствие собственного Timer1 и запрет включения ранее выключенных источников. */
check(sends >= 1 && sends <= 2, "packet count"); /* Требует штатный объём одного такта: пакет ламп и не более одного пакета очередного индикатора. */
} /* Завершает один такт индикации. */
int main(void) /* Запускает на настоящих функциях сценарий рабочих ламп, теста с помехами и возврата в работу. */
{ /* Начинает общий поведенческий сценарий. */
int i, pwm_on = 0; /* Перебирает опросы и такты; считает включённые такты рабочего PWM за один полный период. */
memset(modbus, 0, sizeof(modbus)); /* Убирает старые команды и состояния перед сценарием. */
check(sizeof(WORDE) == sizeof(modbus[0]), "register layout"); /* Подтверждает корректность production-псевдонимов в хостовой модели. */
Desk = dsk_EPLT; /* Выбирает реальную ветвь чтения TESTLAMP пульта. */
modbus[2] = 1; /* Включает рабочую лампу до нажатия TESTLAMP, как в сообщении пользователя. */
Bright[0] = maximum_bright; /* Задаёт уже включённой лампе постоянную яркость для обнаружения случайных провалов. */
entry_mask = M_INT13 | (1U << 0) | (1U << 13); /* Разрешает Timer1, группу ADC и Timer2, проверяя также маскирование равного приоритета. */
tick(); /* Получает первый рабочий пакет ламп. */
check(lamp_word == 1, "normal lamp before test"); /* Подтверждает исходное постоянное свечение до нажатия. */
GpioDataRegs.GPADAT.bit.GPIO26 = 1; /* Нажимает физическую кнопку активным высоким уровнем. */
for (i = 0; i < 1001; i++) get_Buttons(); /* Проходит реальные 1000 накопительных опросов и следующий опрос фиксации порога. */
check(bTestLamp == 1, "test activation"); /* Требует включения теста после полной выдержки. */
for (i = 0; i < 600; i++) { /* Проверяет удержание более BLINK_TIME=500 тактов без подавления штатного медленного мигания. */
unsigned long expected_mask; /* Сохраняет фазу теста перед очередным возмущением кнопки. */
GpioDataRegs.GPADAT.bit.GPIO26 = 0; /* Вводит короткий провал входа на один опрос главного цикла. */
get_Buttons(); /* Выполняет настоящий накопительный фильтр и публикацию кнопки. */
check(bTestLamp == 1, "held test"); /* Проверяет сохранение TESTLAMP вместо мгновенного возврата рабочих масок. */
timer_pending = 1; /* Допускает новый аппаратный такт во время передачи для проверки запрета повторного входа. */
tick(); /* Формирует тестовый пакет при кратком провале физического входа. */
expected_mask = isMask; /* Получает ожидаемую медленную фазу из настоящей what_is. */
check(lamp_word == expected_mask, "test packet during input glitch"); /* Исключает рабочую маску уже горящих ламп из тестового потока. */
check(!digit_sends || (digit_word == isNumb && digit_dot == 4), "test digit packet during input glitch"); /* Требует сохранения тестового значения и формата цифр во время помехи кнопки. */
check(nested_entries == 0, "nested transmission"); /* Требует единственного владельца DATA/CLK на протяжении передачи. */
timer_pending = 0; /* Убирает смоделированное событие после завершения текущего такта. */
GpioDataRegs.GPADAT.bit.GPIO26 = 1; /* Возвращает уровень удерживаемой кнопки. */
get_Buttons(); /* Восстанавливает насыщенный накопитель без смены тестового режима. */
} /* Завершает серию коротких помех при удержании. */
check(isNumb == 1111 && isMask == 0xFFFFFFFFUL, "slow test sequence"); /* После 600 миллисекунд требует единственного штатного шага what_is с периодом 500 тактов, а не ускоренного строба. */
GpioDataRegs.GPADAT.bit.GPIO26 = 0; /* Отпускает физическую кнопку на длительное время. */
for (i = 0; i < 1001; i++) get_Buttons(); /* Даёт накопителю полностью разрядиться и зафиксировать отпускание. */
check(bTestLamp == 0, "test release"); /* Проверяет, что сохранение состояния не залипает в TESTLAMP. */
tick(); /* Возвращает передачу рабочей маски после отпускания. */
check(lamp_word == 1, "normal lamp after test"); /* Восстанавливает уже включённую до теста лампу. */
cTestLamp = 1; /* Включает независимую удалённую команду теста через production-регистр. */
tick(); /* Проверяет приоритет удалённого TESTLAMP при отпущенной физической кнопке. */
check(lamp_word == isMask, "remote test"); /* Требует тестовую маску для обоих источников команды. */
cTestLamp = 0; /* Завершает удалённый тест перед проверкой рабочего PWM. */
Bright[0] = 6; /* Устанавливает шесть включённых тактов из десяти в production-периоде яркости. */
for (i = 0; i < 10; i++) { /* Проверяет один полный период PWM после выхода из теста. */
tick(); /* Даёт настоящей функции вычислить текущую фазу яркости. */
check(lamp_word == 0 || lamp_word == 1, "normal PWM packet"); /* Исключает оставшиеся тестовые биты из рабочей маски. */
pwm_on += lamp_word == 1; /* Измеряет реальное число включённых тактов production-PWM. */
} /* Завершает период обычной яркости. */
check(pwm_on == 6, "normal PWM duty"); /* Подтверждает сохранение заданной яркости 6/10 после выхода из теста. */
printf("%s TESTLAMP: held input glitches, single ISR, normal lamps, release, remote command\n", failures ? "FAIL" : "PASS"); /* Выводит проверенные свойства без заявления о физическом испытании платы. */
return failures ? 1 : 0; /* Возвращает результат всех поведенческих требований. */
} /* Завершает хостовую проверку. */

View File

@@ -0,0 +1,46 @@
"""Проверяет TESTLAMP на настоящих функциях прошивки без подключения платы."""
import argparse # Позволяет использовать доступный GCC для модели аппаратного окружения.
import os # Передаёт компилятору PATH с его вспомогательными программами и библиотеками.
from pathlib import Path # Разрешает исходники и модель относительно каталога этого теста.
import re # Извлекает функции, убирая комментарии, которые могут содержать примеры скобок.
import subprocess # Компилирует и запускает независимые проверки с контролем результата.
import tempfile # Удаляет только временные исходники и исполняемые файлы данного запуска.
ROOT = Path(__file__).resolve().parents[2] # Получает корень репозитория из расположения tests/testlamp.
def source(name): # Читает production-модуль без изменения исходного файла.
return re.sub(r"/\*.*?\*/|//[^\n]*", "", (ROOT / "Source/Internal" / name).read_text(encoding="utf-8"), flags=re.S) # Убирает комментарии перед разбором вложенных блоков.
def function(text, name): # Выбирает определение функции вместо копии её алгоритма в тесте.
match = re.search(r"(?:interrupt\s+)?(?:void|int)\s+" + name + r"\([^;{}]*\)\s*\{", text) # Отличает тело функции от прототипов и вызовов.
assert match is not None, name # Завершает проверку, если проверяемая production-функция исчезла.
end, depth = match.end(), 1 # Учитывает найденную открывающую скобку внешнего блока.
while depth: # Читает все вложенные ветви до конца определения.
depth += (text[end] == "{") - (text[end] == "}") # Находит парную закрывающую скобку.
end += 1 # Включает текущий символ в извлекаемый фрагмент.
return text[match.start():end] # Сохраняет порядок операторов настоящей функции.
parser = argparse.ArgumentParser(description=__doc__) # Объясняет назначение отдельного запуска проверки.
parser.add_argument("--cc", default="C:/msys64/mingw64/bin/gcc.exe", help="Путь к GCC") # Повторяет установленный в этом проекте хостовый компилятор.
args = parser.parse_args() # Разбирает параметры до формирования временных файлов.
button = function(source("peripher.c"), "get_Buttons") # Проверяет именно публикацию отфильтрованной кнопки в Modbus.
pult = source("pulto.c") # Берёт текущую обработку индикации, включая реальные ветви теста и яркости.
body = "\n".join((function(source("measure.c"), "er_anal"), button, function(pult, "what_is"), function(pult, "cpu_timer1_isr_PULT"))) # Собирает функции, участвующие в переключении режима и передаче масок.
before, after = Path(__file__).with_name("model.inc").read_text(encoding="utf-8").split("/* HANDLERS */") # Помещает production-функции между аппаратными заглушками и поведенческими сценариями.
old_button, count_button = re.subn(r"(er_anal\(GpioDataRegs\.GPADAT\.bit\.GPIO26,\s*&INcount0,\s*1000,\s*)bTestLamp(\))", r"\g<1>0\2", body) # Возвращает сброс фильтра при одном провале только во временную мутацию.
old_mask, count_mask = re.subn(r"IER\s*&=\s*\(MINT13\s*&\s*~M_INT13\);", "IER |= MINT13;", body) # Восстанавливает ошибочное разрешение прерываний в отдельном временном варианте.
assert count_button == count_mask == 1, "Не найдены единственные места исправлений TESTLAMP" # Не позволяет мутации незаметно проверять неизменённый код.
environment = dict(os.environ) # Сохраняет окружение основного процесса.
environment["PATH"] = str(Path(args.cc).resolve().parent) + os.pathsep + environment.get("PATH", "") # Делает DLL и вспомогательные программы GCC доступными дочерним процессам.
with tempfile.TemporaryDirectory(prefix="testlamp-") as directory: # Изолирует артефакты каждой проверки от дерева прошивки.
for name, functions, failure in (("production", body, None), ("old_button", old_button, "FAIL held test"), ("old_mask", old_mask, "FAIL interrupt mask")): # Проверяет исправление и чувствительность сценариев к каждой из двух старых ошибок.
c_path, exe_path = Path(directory) / (name + ".c"), Path(directory) / (name + ".exe") # Разделяет временные исходники и программы трёх вариантов.
c_path.write_text(before + functions + after, encoding="utf-8") # Сохраняет модель и русские пояснения в UTF-8.
subprocess.run([args.cc, "-std=c99", "-O3", "-fno-strict-aliasing", "-Werror=implicit-function-declaration", "-I", str(ROOT / "Source/Internal/Include"), "-I", str(ROOT / "Source/External/v120/DSP2833x_common/include"), str(c_path), "-o", str(exe_path)], env=environment, check=True) # Сохраняет адреса production-псевдонимов регистров и использует реальную таблицу приоритетов TI.
result = subprocess.run([str(exe_path)], env=environment, capture_output=True, text=True, timeout=20) # Ограничивает зависание и сохраняет конкретные нарушенные условия.
if failure is None: # Рабочая версия обязана пройти все сценарии.
print(result.stdout, end="") # Показывает результат поведенческих проверок текущей прошивки.
assert result.returncode == 0, result.stdout + result.stderr # Возвращает ошибку при любой регрессии TESTLAMP или рабочего режима.
else: # Старая ошибка должна воспроизводимо нарушить соответствующее требование.
assert result.returncode == 1 and failure in result.stdout, result.stdout + result.stderr # Доказывает, что тест действительно обнаруживает возвращённый дефект.
print("PASS mutation:", name, "rejected") # Сообщает об ожидаемом провале временного варианта со старой ошибкой.

View File

@@ -0,0 +1,87 @@
#include <stdint.h> /* Задаёт точные размеры регистров и слов протокола при исполнении модели на ПК. */
#include "ump_tms28335.h" /* Подключает настоящий интерфейс проверки запросов и упаковки фрагментов CAN. */
#define UMP_CAN_MAX_WORDS UMP_MAX_WORDS /* Повторяет максимальную длину ответа из рабочего заголовка адаптера. */
#define UMP_CAN_MARKER UMP_MARKER /* Использует каноническую метку отличия служебного кадра от технологических данных. */
#define ump_can_prepare ump_tms28335_prepare /* Сохраняет штатное соответствие имени адаптера канонической функции порта. */
#define ANSWER_LEN 128U /* Моделирует границу штатных технологических регистров для компиляции настоящего Handlai. */
#define dsk_LOAD 6 /* Повторяет номер платы нагрузки из package.h для компиляции технологической ветви Handlai; сценарии используют служебные кадры. */
#define CHECK(condition) do { if (!(condition)) return __LINE__; } while (0) /* Сохраняет проверки при O3 и возвращает точное место регрессии вызывающему Python. */
struct MODEL_REG { uint32_t all; }; /* Моделирует атомарное 32-битное чтение и запись слова аппаратного регистра. */
struct MODEL_MAILBOX { struct MODEL_REG MDL, MDH; struct { struct { unsigned int DLC; } bit; } MSGCTRL; }; /* Предоставляет реальные имена полей данных и длины кадра, читаемые рабочим кодом. */
struct ECAN_MBOXES { struct MODEL_MAILBOX MBOX1, MBOX2; }; /* Отделяет входящий запрос в mailbox 1 от служебного ответа в mailbox 2. */
static struct { struct MODEL_REG CANTA, CANAA, CANTRR, CANTRS; } ECanaRegs; /* Хранит подтверждения, отмену и факт запуска передачи для наблюдения сценарием. */
static struct ECAN_MBOXES ECanaMboxes; /* Предоставляет обработчикам адресуемую память вместо физической периферии. */
static struct { unsigned long InterruptCount; } CpuTimer1; /* Задаёт миллисекундное время, от которого сервис считает тайм-аут ожидания ответа. */
static int modbus[ANSWER_LEN], Desk, Lonely; /* Обеспечивает зависимости технологической ветви Handlai, не исполняемой при служебном запросе. */
static unsigned int model_reads, model_writes, model_unexpected, model_irq_mask; /* Позволяет отличить ложную команду, корректное чтение и несбалансированную блокировку IRQ. */
static unsigned int __disable_interrupts(void) { unsigned int saved = model_irq_mask; model_irq_mask = 1; return saved; } /* Имитирует сохранение предыдущей маски, чтобы вложенные вызовы оставались проверяемыми. */
static void __restore_interrupts(unsigned int saved) { model_irq_mask = saved; } /* Возвращает исходную маску и позволяет сценарию обнаружить оставленную блокировку. */
static void Load_voltage_can(unsigned int header, unsigned int a, unsigned int b, unsigned int c) { (void)header; (void)a; (void)b; (void)c; model_unexpected++; } /* Считает ошибочным попадание служебного запроса в обработку технологического напряжения. */
static void ump_log_can(unsigned int header, unsigned int a, unsigned int b, unsigned int c) { (void)header; (void)a; (void)b; (void)c; model_unexpected++; } /* Обнаруживает лишнюю регистрацию служебного опроса как управляющего CAN-события. */
static void led2_toggle(void) { model_unexpected++; } /* Отмечает проход по обычной ветви CAN вместо раннего возврата служебного запроса. */
static unsigned int Load_protection_prepare(unsigned int fn, uint16_t address, uint16_t value, uint16_t *reply, unsigned int *error) { (void)fn; (void)address; (void)value; (void)reply; *error = 2; model_unexpected++; return 0; } /* Запросы теста адресуют журнал, поэтому попадание в карту защиты является ошибкой маршрутизации. */
#if EEPROM_M95M02 /* Компилирует зависимости дополнительной ветви так же, как прошивка профиля M95M02. */
static int gas167_contains(uint16_t address) { return address >= 0x5000U && address < 0x5080U; } /* Отделяет область GAS от проверяемого журнала, не копируя реализацию профиля. */
static unsigned int gas167_prepare(unsigned int fn, uint16_t address, uint16_t value, int can, uint16_t *reply, unsigned int *error) { (void)fn; (void)address; (void)value; (void)can; (void)reply; *error = 2; model_unexpected++; return 0; } /* Делает неожиданное обращение к GAS наблюдаемой ошибкой в тесте запуска журнала. */
#endif /* Завершает минимальные зависимости профиля, не подменяя проверку общей CAN-маршрутизации. */
unsigned int ump_log_read(unsigned int address) { model_reads++; return 0x5500U + address - UMP_BASE; } /* Возвращает узнаваемые слова backend, чтобы ответ нельзя было спутать со старым содержимым RAM. */
int ump_log_write(unsigned int address, unsigned int value) { (void)address; (void)value; model_writes++; return 1; } /* Регистрирует любую нежелательную запись, случайно возникшую из остаточного запроса. */
/* PRODUCTION_CAN */
static void model_reset_hardware(void) /* Очищает только модель периферии; управляющую RAM оставляет сценарию для воспроизведения холодного старта. */
{ /* Начинает воспроизводимое состояние аппаратных mailbox после сброса контроллера. */
ECanaRegs.CANTA.all = 0; ECanaRegs.CANAA.all = 0; ECanaRegs.CANTRR.all = 0; ECanaRegs.CANTRS.all = 0; /* Убирает подтверждения и запросы, которые аппаратный сброс не сохраняет вместе с RAM. */
ECanaMboxes.MBOX2.MDL.all = 0; ECanaMboxes.MBOX2.MDH.all = 0; /* Обнуляет наблюдаемые данные ответа для обнаружения каждой новой передачи. */
CpuTimer1.InterruptCount = 1000; model_reads = 0; model_writes = 0; model_unexpected = 0; model_irq_mask = 0; /* Задаёт миллисекундный такт и независимые счётчики нового сценария. */
} /* Завершает аппаратный сброс без скрытой инициализации проверяемых переменных прошивки. */
static void model_poison_state(void) /* Воссоздаёт допустимые остатки RAM, ранее приводившие к ответу без входного запроса. */
{ /* Начинает заполнение всех управляющих полей ненулевыми либо специально подобранными значениями. */
ump_can_pending = 0; ump_can_tag = 0xA506U; ump_can_address = UMP_BASE; ump_can_value = 1; /* Сохраняет след прежней команды записи, но отмечает отсутствие нового принятого запроса. */
ump_can_length = 2; ump_can_index = 0; ump_can_reply_tag = 0x0100U; ump_can_waiting = 0; ump_can_sent_at = 777; /* Представляет старый двухсловный ответ с token 1, который сервис ошибочно считает готовым. */
ump_can_reply[0] = 0x1234U; ump_can_reply[1] = 0x5678U; /* Создаёт отличимый от backend payload для доказательства отправки именно остаточного буфера. */
} /* Завершает заполнение состояния, которое настоящий сброс обязан обезвредить. */
static int model_first_request(unsigned int token) /* Проверяет весь первый ответ после сброса через настоящий приёмник, валидатор и упаковщик. */
{ /* Начинает независимую транзакцию чтения 16 слов заголовка журнала. */
unsigned int fragment; /* Перебирает восемь CAN-фрагментов, каждый из которых содержит два 16-битных слова. */
ECanaMboxes.MBOX1.MDH.all = ((uint32_t)UMP_CAN_MARKER << 16) | ((uint32_t)token << 8) | 3U; /* Формирует служебную метку, новый token и штатную функцию чтения FC03. */
ECanaMboxes.MBOX1.MDL.all = ((uint32_t)UMP_BASE << 16) | 16U; ECanaMboxes.MBOX1.MSGCTRL.bit.DLC = 8; /* Запрашивает допустимый восьмибайтный кадр чтения полного 16-словного заголовка. */
Handlai(&ECanaMboxes); /* Передаёт запрос настоящему разборщику mailbox без прямой установки поля pending. */
CHECK(ump_can_pending == 1 && model_reads == 0 && model_writes == 0); /* Проверяет, что ISR только опубликовал запрос и не исполнил его вместо главного цикла. */
for (fragment = 0; fragment < 8; fragment++) { /* Проверяет все фрагменты, включая последний, чтобы сброс счётчиков не скрывал укороченный ответ. */
UMP_CAN_service(); /* Готовит снимок при первом вызове и далее отправляет по одному настоящему фрагменту. */
CHECK(ECanaRegs.CANTRS.all == 4 && ump_can_waiting == 1); /* Требует запуска mailbox 2 и ожидания подтверждения именно отправленного кадра. */
CHECK(ECanaMboxes.MBOX2.MDL.all == (((uint32_t)(0x5500U + fragment * 2U) << 16) | (0x5501U + fragment * 2U))); /* Сравнивает оба слова кадра с содержимым нового снимка, исключая остатки прежнего ответа. */
CHECK(ECanaMboxes.MBOX2.MDH.all == (((uint32_t)(UMP_CAN_MARKER + fragment) << 16) | ((uint32_t)token << 8))); /* Проверяет порядок фрагментов, token текущего запроса и отсутствие кода ошибки. */
ECanaRegs.CANTRS.all = 0; ECanaRegs.CANTA.all = 4; /* Имитирует окончание передачи и подтверждение только проверенного фрагмента аппаратурой CAN. */
} /* Завершает передачу всех 16 запрошенных слов. */
UMP_CAN_service(); ECanaRegs.CANTA.all = 0; /* Позволяет сервису принять последнее подтверждение; затем моделирует очистку W1C-регистра аппаратурой. */
CHECK(ECanaRegs.CANTRS.all == 0 && ump_can_waiting == 0 && ump_can_pending == 0); /* Убеждается, что после последнего ACK не отправляется лишний либо старый фрагмент. */
CHECK(model_reads == 16 && model_writes == 0 && model_unexpected == 0 && model_irq_mask == 0); /* Требует единственного согласованного снимка, отсутствия ложных команд и восстановленной маски IRQ. */
return 0; /* Сообщает вызывающему сценарию о полном успешном ответе после инициализации. */
} /* Завершает поведенческую проверку первой транзакции. */
#ifdef _WIN32 /* Экспортирует тест явно для загрузки MinGW DLL через ctypes в Windows. */
__declspec(dllexport) /* Делает run_tests видимой снаружи библиотеки без таблицы экспорта проекта прошивки. */
#endif /* На остальных платформах используется обычная видимость глобальной функции. */
int run_tests(void) /* Возвращает ноль только при выполнении всех сценариев запуска и повторного сброса. */
{ /* Начинает проверку реального дефекта до сброса и его устранения рабочим helper. */
int result; /* Передаёт точную строку сбоя из сценария полной CAN-транзакции. */
model_reset_hardware(); model_poison_state(); UMP_CAN_service(); /* Воспроизводит старое поведение на грязной RAM без вызова добавленного сброса. */
CHECK(ECanaRegs.CANTRS.all == 4 && ECanaMboxes.MBOX2.MDL.all == 0x12345678UL && ump_can_pending == 0); /* Доказывает самопроизвольный ответ, чтобы тест не оказался нечувствителен к исходной регрессии. */
model_reset_hardware(); model_poison_state(); ump_can_init(); /* Вызывает настоящий новый сброс при тех же остатках RAM и чистой периферии. */
CHECK(ump_can_pending == 0 && ump_can_tag == 0 && ump_can_address == 0 && ump_can_value == 0); /* Проверяет, что старые параметры не смогут превратиться в ложную принятую команду. */
CHECK(ump_can_length == 0 && ump_can_index == 0 && ump_can_reply_tag == 0 && ump_can_waiting == 0 && ump_can_sent_at == 0); /* Требует очистки всех управляющих полей незавершённой передачи и тайм-аута. */
UMP_CAN_service(); UMP_CAN_service(); /* Даёт главному циклу повторно обработать состояние до появления первого запроса. */
CHECK(ECanaRegs.CANTRS.all == 0 && ECanaRegs.CANTRR.all == 0 && model_reads == 0 && model_writes == 0); /* Запрещает ложную передачу, отмену несуществующего кадра и исполнение остаточной команды. */
result = model_first_request(0x37U); if (result) return result; /* Проверяет приём и все фрагменты первого запроса после холодного запуска. */
model_reset_hardware(); model_poison_state(); ump_can_waiting = 1; ump_can_pending = 1; /* Воспроизводит перезапуск во время передачи с ещё не обработанным старым запросом в RAM. */
ump_can_init(); CpuTimer1.InterruptCount += 1000; UMP_CAN_service(); /* Проверяет сброс ожидания даже после истечения прежнего тайм-аута в 250 мс. */
CHECK(ECanaRegs.CANTRS.all == 0 && ECanaRegs.CANTRR.all == 0 && ump_can_pending == 0 && ump_can_waiting == 0); /* Не допускает зависания в отмене старого mailbox либо исполнения устаревшего pending. */
result = model_first_request(0x59U); if (result) return result; /* Доказывает, что после такого перезапуска новый token обслуживается полной последовательностью фрагментов. */
return 0; /* Подтверждает исправление холодного старта без изменения алгоритма штатного CAN-ответа. */
} /* Завершает экспортированную проверку регрессии для выбранного профиля EEPROM. */

View File

@@ -0,0 +1,56 @@
# Проверяет запуск служебного CAN на грязной RAM: использует рабочие обработчики и канонический упаковщик протокола.
import os # Читает пути общей библиотеки и компилятора, не меняя настройки проекта.
from pathlib import Path # Строит абсолютные пути независимо от каталога запуска проверки.
import re # Извлекает рабочие функции, не заменяя их алгоритмы копиями в модели.
import shutil # Находит доступный компилятор GCC по пользовательскому PATH.
import subprocess # Запускает компиляцию и отдельный процесс проверки с контролем кода завершения.
import sys # Повторно использует текущий Python для загрузки тестовой библиотеки.
import tempfile # Изолирует сгенерированный код и библиотеку от исходников и образов прошивки.
root = Path(__file__).resolve().parents[2] # Находит корень репозитория по расположению постоянного теста.
templates = Path(os.environ.get("TEMPLATES_ROOT", root.parent / "newProject/SETGUI/third_party/templates")) # Повторяет настройку общей библиотеки существующих тестов УМП.
protocol = templates / "c/set-protocol" # Выбирает канонические проверку запросов и формат фрагментов CAN.
compiler = os.environ.get("CC") or shutil.which("gcc") or "C:/msys64/mingw64/bin/gcc.exe" # Поддерживает заданный CC и установленный в рабочем окружении MinGW.
environment = os.environ.copy() # Ограничивает изменение PATH процессами компилятора и модели.
environment["PATH"] = str(Path(compiler).resolve().parent) + os.pathsep + environment.get("PATH", "") # Делает доступными вспомогательные DLL выбранного компилятора в Windows.
def function(text, name): # Возвращает полное тело указанной функции вместе с её рабочими комментариями.
match = re.search(r"^(?:static\s+)?(?:void|int)\s+" + re.escape(name) + r"\([^;{}]*\)", text, re.M) # Отличает определение функции от вызова и прототипа.
if not match: # Не позволяет тесту незаметно проверять устаревшую копию после переименования функции.
raise AssertionError(f"Не найдена рабочая функция {name}") # Завершает проверку с названием отсутствующей точки интеграции.
end = re.search(r"^}", text[match.end():], re.M) # Использует принятое в модуле размещение закрывающей скобки функции в первом столбце.
if not end: # Отвергает неполный фрагмент вместо генерации частично работающей модели.
raise AssertionError(f"Не найден конец функции {name}") # Указывает причину невозможности извлечения рабочего алгоритма.
return text[match.start():match.end() + end.end()] + "\n" # Сохраняет исходный порядок операторов для компиляции под O3.
source = (root / "Source/Internal/ecan.c").read_text(encoding="utf-8") # Читает именно текущие исходники транспорта, включая новый сброс состояния.
startup = function(source, "InitCan") # Проверяет реальную связь сброса с аппаратной инициализацией, а не только отдельный helper.
startup_code = re.sub(r"/\*.*?\*/|//[^\n]*", "", startup, flags=re.S) # Удаляет комментарии, чтобы упоминания helper или регистров не выдавались за вызов.
assert len(re.findall(r"\bump_can_init\s*\(\s*\)\s*;", startup_code)) == 1, "InitCan должен один раз вызывать ump_can_init" # Требует выполнения нового сброса при каждом аппаратном запуске.
hardware_start = re.search(r"\b(?:EALLOW|GpioCtrlRegs|ECanaRegs|PieCtrlRegs|IER)\b", startup_code) # Находит первую настройку периферии или разрешение CAN-прерываний.
assert hardware_start and startup_code.index("ump_can_init()") < hardware_start.start(), "Сброс CAN должен предшествовать настройке периферии" # Не допускает окна прерывания с неочищенными полями обмена.
state_start = source.index("static volatile unsigned int ump_can_pending;") # Начинает извлечение общих между ISR и главным циклом переменных.
state_end = source.index("static unsigned long ump_can_sent_at;") + len("static unsigned long ump_can_sent_at;") # Ограничивает фрагмент управляющими полями и штатным буфером ответа.
state = source[state_start:state_end] # Использует объявления из рабочего модуля, чтобы тест замечал изменение состава состояния.
state = state.replace("static unsigned int ump_can_reply[", "static uint16_t ump_can_reply[") # Воспроизводит на ПК 16-битный unsigned int C28x именно в буфере слов CAN.
model = (Path(__file__).with_name("model.inc")).read_text(encoding="utf-8") # Читает аппаратную модель и поведенческие сценарии, сохраняемые рядом с запускателем.
body = state + "\n" + "".join(function(source, name) for name in ("ump_can_init", "Handlai", "UMP_CAN_service")) # Подставляет сброс, настоящий приём запроса и сервис отправки без изменений их логики.
assert model.count("/* PRODUCTION_CAN */") == 1, "Нужна единственная точка подключения рабочего кода" # Исключает пропуск или двойную компиляцию проверяемых функций.
model = model.replace("/* PRODUCTION_CAN */", body) # Встраивает текущие обработчики между аппаратной моделью и сценариями проверки.
with tempfile.TemporaryDirectory(prefix="ump-can-init-") as directory: # Автоматически удаляет только временные результаты этой проверки.
build = Path(directory) # Фиксирует каталог файлов, не затрагивающих бинарные артефакты репозитория.
source_file = build / "can_init_test.c" # Выделяет общий сгенерированный исходник для обоих профилей EEPROM.
source_file.write_text(model, encoding="utf-8") # Сохраняет русские комментарии и извлечённые исходники без потери кодировки.
for profile in (0, 1): # Проверяет обе ветви маршрутизации CAN: AT25256B и M95M02.
library = build / (f"can_init_{profile}.dll" if os.name == "nt" else f"can_init_{profile}.so") # Разделяет библиотеки, чтобы профиль не подменял результат соседней сборки.
command = [compiler, "-O3", "-shared", "-Wall", "-Wextra", "-Werror", f"-DEEPROM_M95M02={profile}"] # Проверяет рабочий код с оптимизацией O3 и запрещает скрывать предупреждения модели.
command.append("-Wno-misleading-indentation") # Допускает существующие смешанные отступы Handlai без изменения проверяемого исходника TI.
if os.name != "nt": # Учитывает требования загрузки разделяемых библиотек ELF на Linux.
command.append("-fPIC") # Генерирует переносимые адреса только там, где они нужны формату библиотеки.
command += ["-I" + str(protocol / "ports/tms320f28335"), str(source_file)] # Передаёт модели официальные объявления порта C28x и текущий извлечённый код.
command += [str(protocol / "src/ump_protocol.c"), str(protocol / "ports/tms320f28335/ump_tms28335.c"), "-o", str(library)] # Линкует настоящие валидатор и упаковщик фрагментов вместо их заглушек.
subprocess.run(command, cwd=root, env=environment, check=True) # Прерывает проверку при ошибке любого профиля до объявления успешного результата.
runner = "import ctypes,sys; result=ctypes.CDLL(sys.argv[1]).run_tests(); print('PASS' if result==0 else f'FAIL: C line {result}'); sys.exit(bool(result))" # Возвращает строку неуспешной проверки C без зависимости от assert и режима NDEBUG.
subprocess.run([sys.executable, "-c", runner, str(library)], cwd=root, env=environment, check=True) # Освобождает DLL завершением дочернего процесса перед очисткой временного каталога Windows.
print(f"EEPROM_M95M02={profile}: холодный старт и первый запрос CAN проверены при -O3") # Показывает независимо подтверждённый результат каждого аппаратного профиля.