Обновить логгер УМП и исправить запуск UART и EEPROM

Перейти на компактные 12-словные записи v4 и сохранять 10 процентов банка после отключения. Добавить трёхсекундное ожидание роста ЗПТ и настраиваемый лимит пусков. Явно инициализировать состояние UART и гарантировать публикацию параметров EEPROM перед запуском Timer2. Сохранить воспроизводимые сборки, регрессионные проверки, документацию и обновлённые результаты сборки; исключить временные артефакты.
This commit is contained in:
2026-10-12 12:25:41 +03:00
parent f741741cf8
commit 1e911e5250
38 changed files with 2089 additions and 1485 deletions

34
.gitignore vendored
View File

@@ -24,3 +24,37 @@
/Bin/*.bin.manifest.json
# Исключает из Git артефакты по шаблону ниже.
/Bin/*.bin.sha256
# Кэш Python восстанавливается автоматически и не относится к исходникам прошивки.
**/__pycache__/
# Загруженные локальные инструменты документации не нужны для хранения изменений проекта.
/Doc/.tools/
# HTML-документация и диагностические журналы Doxygen создаются из исходных документов.
/Doc/build/
# Объекты компиляции восстанавливаются скриптами сборки и зависят от локальных инструментов TI.
/Bin/**/obj/
# Паспорт и заголовок конкретной сборки генерируются перед компиляцией из версии и состояния Git.
/Bin/**/generated/
# Исполняемые образы TI в экспериментальных каталогах являются результатом компиляции.
/Bin/**/*.out
# Карты новых сборок воспроизводятся линкером; ранее отслеживаемые карты остаются в Git.
/Bin/**/*.map
# HEX новых сборок дублирует локальные OUT/BIN; уже отслеживаемые образы сохраняются в истории.
/Bin/**/*.hex
# Листинги TI создаются из OUT для проверки порядка машинных инструкций EEPROM.
/Bin/**/*disassembly*.txt
# Кандидат SCI8 предназначен для проверки перед выпуском окончательного образа.
/Bin/**/*.candidate
# Локальные загрузочные образы пересоздаются из исходников и скриптов соответствующей сборки.
/Bin/**/*.bin
# Манифест конкретного образа содержит время и состояние локальной сборки.
/Bin/**/*.bin.manifest.json
# Контрольная сумма создаётся вместе с локальным загрузочным образом.
/Bin/**/*.bin.sha256
# Журналы компиляции и диагностики зависят от локального запуска инструментов.
/Bin/**/*.log
# Копии паспорта в каталогах с отметкой времени дублируют генерируемые метаданные сборки.
/Bin/**/firmware_identity.json
# Снимки интерфейса, использованные для проверки состава каналов, являются локальными артефактами.
/Bin/**/logger_channels.png
# Снимки предпросмотра защиты используются только при визуальной проверке интерфейса.
/Bin/**/gui_preview.png

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@@ -12,20 +12,20 @@ PHYSICAL MEMORY PARAMETERS
BOOT LOADER PARAMETERS
Table Type: SERIAL PORT (SCI 8 bit Mode)
Entry Point: 0x0000b9b5
Entry Point: 0x0000a8d1
OUTPUT TRANSLATION MAP
--------------------------------------------------------------------------------
00000000..003fffff Page=0 Memory Width=8 ROM Width=8
--------------------------------------------------------------------------------
OUTPUT FILES: UKSSTMS320F28335_34a95bc5.bin [b0..b7]
OUTPUT FILES: UKSSTMS320F28335_c6c91282.bin.pending [b0..b7]
CONTENTS: 00000000..00007f05 BOOT TABLE
.cinit : dest=0000c000 size=0000028b width=00000002
.text : dest=00008000 size=00003b73 width=00000002
.econst : dest=0000c28c size=00000125 width=00000002
.switch : dest=0000c3b2 size=00000048 width=00000002
CONTENTS: 00000000..00007ffb BOOT TABLE
.cinit : dest=0000c000 size=00000273 width=00000002
.text : dest=00008000 size=00003bfc width=00000002
.econst : dest=0000c274 size=0000012b width=00000002
.switch : dest=0000c3a0 size=0000004c width=00000002
--------------------------------------------------------------------------------
00000000..003fffff Page=1 Memory Width=8 ROM Width=8 "*DEFAULT PAGE 1*"

File diff suppressed because one or more lines are too long

View File

@@ -1,15 +1,20 @@
# Проверка комментариев и кодировки
Проверка относится к редактируемым исходникам C/H, ASM, CMD, тестовым INC и Python.
Каждая непустая строка кода имеет русское пояснение перед ней или на ней. Пустые строки,
текст существующих комментариев и содержимое многострочных строк данных не считаются кодом.
Для каждой непустой строки кода проверяется русский текст на ней или непосредственно перед ней.
Пустые строки, текст комментариев и содержимое многострочных строк данных не считаются кодом.
Качество и достоверность пояснений этой проверкой не устанавливаются; совпадение возможно и в строковом литерале.
Охват: исходники из Git-индекса. Сгенерированные файлы и подключённые соседние библиотеки проверяются отдельно.
Исходные уведомления TI сохранены. JSON-паспорта, индексы IDE, таблицы XLS и двоичные
результаты сборки не допускают исходных комментариев; их назначение описано в документации.
UTF-8 проверен в 151 текстовых файлах. Строк кода: 18624.
UTF-8 проверен в 157 текстовых файлах. Строк кода: 18866.
| Файл | Строк кода | С русским пояснением |
| Файл | Строк кода | С русским текстом рядом |
| --- | ---: | ---: |
| Bin/EepromPublishFix/rebuild.py | 41 | 41 |
| Bin/StartupWait3s/rebuild.py | 41 | 41 |
| Bin/UartColdStart/rebuild.py | 41 | 41 |
| F28335.cmd | 69 | 69 |
| Source/External/v120/DSP2833x_common/include/DSP2833x_DefaultIsr.h | 89 | 89 |
| Source/External/v120/DSP2833x_common/include/DSP2833x_Dma_defines.h | 44 | 44 |
@@ -52,7 +57,7 @@ UTF-8 проверен в 151 текстовых файлах. Строк код
| Source/External/v120/DSP2833x_headers/include/DSP2833x_Xintf.h | 77 | 77 |
| Source/External/v120/DSP2833x_headers/source/DSP2833x_GlobalVariableDefs.c | 301 | 301 |
| Source/Internal/ADC.c | 244 | 244 |
| Source/Internal/DAC.c | 244 | 244 |
| Source/Internal/DAC.c | 253 | 253 |
| Source/Internal/Include/ADC.h | 4 | 4 |
| Source/Internal/Include/DAC.h | 11 | 11 |
| Source/Internal/Include/GPIO_table.h | 329 | 329 |
@@ -66,27 +71,27 @@ UTF-8 проверен в 151 текстовых файлах. Строк код
| Source/Internal/Include/filter_bat2.h | 36 | 36 |
| Source/Internal/Include/gas167.h | 17 | 17 |
| Source/Internal/Include/kanal.h | 1 | 1 |
| Source/Internal/Include/log_to_mem.h | 37 | 37 |
| Source/Internal/Include/log_to_mem.h | 36 | 36 |
| Source/Internal/Include/measure.h | 90 | 90 |
| Source/Internal/Include/message.h | 32 | 32 |
| Source/Internal/Include/package.h | 127 | 127 |
| Source/Internal/Include/package.h | 128 | 128 |
| Source/Internal/Include/peripher.h | 128 | 128 |
| Source/Internal/Include/pulto.h | 1 | 1 |
| Source/Internal/Include/spise2p.h | 74 | 74 |
| Source/Internal/Include/tools.h | 5 | 5 |
| Source/Internal/Include/ump_can_protocol.h | 8 | 8 |
| Source/Internal/RS485.c | 530 | 530 |
| Source/Internal/RS485.c | 534 | 534 |
| Source/Internal/bios.c | 236 | 236 |
| Source/Internal/cntrl_adr.c | 17 | 17 |
| Source/Internal/crc16.c | 158 | 158 |
| Source/Internal/ecan.c | 242 | 242 |
| Source/Internal/ecan.c | 236 | 236 |
| Source/Internal/filter_bat2.c | 12 | 12 |
| Source/Internal/gas167.c | 53 | 53 |
| Source/Internal/gas167.c | 54 | 54 |
| Source/Internal/kanal.c | 153 | 153 |
| Source/Internal/log_to_mem.c | 236 | 236 |
| Source/Internal/log_to_mem.c | 217 | 217 |
| Source/Internal/main.c | 167 | 167 |
| Source/Internal/measure.c | 625 | 625 |
| Source/Internal/message.c | 289 | 289 |
| Source/Internal/message.c | 293 | 293 |
| Source/Internal/peripher.c | 227 | 227 |
| Source/Internal/pulto.c | 88 | 88 |
| Source/Internal/shared_ump.c | 4 | 4 |
@@ -95,16 +100,17 @@ UTF-8 проверен в 151 текстовых файлах. Строк код
| UKSSTMS320F28335/28335_RAM_lnk.cmd | 58 | 58 |
| UKSSTMS320F28335/firmware_version.h | 6 | 6 |
| UKSSTMS320F28335/prepare_identity.py | 41 | 41 |
| tests/comments/run_test.py | 127 | 127 |
| tests/comments/run_test.py | 129 | 129 |
| tests/eeprom_profiles/check_publication.py | 18 | 18 |
| tests/eeprom_profiles/run_test.py | 20 | 20 |
| tests/eeprom_profiles/spi_test.c | 46 | 46 |
| tests/eeprom_profiles/stubs/DSP2833x_Device.h | 22 | 22 |
| tests/firmware_identity/check_build.py | 35 | 35 |
| tests/firmware_identity/port_test.c | 29 | 29 |
| tests/gas167/check_image.py | 44 | 44 |
| tests/gas167/gas167_test.c | 191 | 191 |
| tests/gas167/run_test.py | 45 | 45 |
| tests/load_control/load_control_test.c | 93 | 93 |
| tests/gas167/gas167_test.c | 213 | 213 |
| tests/gas167/run_test.py | 49 | 49 |
| tests/load_control/load_control_test.c | 170 | 170 |
| tests/load_control/run_test.py | 15 | 15 |
| tests/load_control/stubs/DSP2833x_Device.h | 9 | 9 |
| tests/load_control/stubs/DSP2833x_SWPrioritizedIsrLevels.h | 0 | 0 |
@@ -112,13 +118,13 @@ UTF-8 проверен в 151 текстовых файлах. Строк код
| tests/load_control/stubs/filter_bat2.h | 0 | 0 |
| tests/load_control/stubs/measure.h | 4 | 4 |
| tests/load_control/stubs/message.h | 1 | 1 |
| tests/load_control/stubs/package.h | 17 | 17 |
| tests/load_control/stubs/package.h | 18 | 18 |
| tests/load_control/stubs/peripher.h | 14 | 14 |
| tests/load_control/stubs/tools.h | 0 | 0 |
| tests/rs232_fifo/model.inc | 113 | 113 |
| tests/rs232_fifo/model.inc | 122 | 122 |
| tests/rs232_fifo/run_test.py | 53 | 53 |
| tests/ump_logger/init_test.c | 52 | 52 |
| tests/ump_logger/recorder_test.c | 151 | 151 |
| tests/ump_logger/init_test.c | 44 | 44 |
| tests/ump_logger/recorder_test.c | 152 | 152 |
| tests/ump_logger/run_init_test.py | 30 | 30 |
| tests/ump_logger/run_test.py | 34 | 34 |
| tests/ump_logger/stubs/ADC.h | 1 | 1 |

View File

@@ -21,7 +21,7 @@ CLI define EEPROM_M95M02 должен передаваться и компиля
| 0x5051 | 0x0051 | Штатный регистр останова | RW |
| 0x5052 | 0x0052 | CAN timeout LOAD, мс | RW; для LOAD 1…60000 |
| 0x507C | 0x007C | LOAD_STATUS | Только чтение для LOAD |
| 0x507D | 0x007D | LOAD_ATTEMPTS | Только чтение для LOAD |
| 0x507D | 0x007D | LOAD_MAX_ATTEMPTS, лимит пусков | RW; для LOAD 1…65535, по умолчанию 5 |
| 0x507E | 0x007E | LastMode | Как штатный регистр |
| 0x507F | 0x007F | Commands, битовая маска | RW; штатная фиксация команды |
| 0x5F00…0x5F07 | Константы GAS-профиля | Сигнатура, версия, возможности | Только чтение |
@@ -66,7 +66,8 @@ CLI define EEPROM_M95M02 должен передаваться и компиля
| Функция отличается от 3/6 | Код 1, illegal function |
| Адрес вне региона; блок пересекает границу; запись паспорта GAS | Код 2, illegal address |
| FC03 quantity = 0 или >124; нечётное количество CAN | Код 3, illegal value |
| LOAD: запись 0x507C или 0x507D | Код 2; значения не меняются |
| LOAD: запись 0x507C | Код 2; статус не меняется |
| LOAD: запись нуля в 0x507D | Код 3; прежний лимит не меняется |
| LOAD: запись timeout 0 или >60000 в 0x5052 | Код 3; значение не меняется |
| Запись 0x507F | Штатная запись Commands и вызов ump_log_rs, как при FC06(0x007F) |

View File

@@ -80,7 +80,7 @@ GAS_ID = номер_узла × 1000 + смещение
| `DAC_stop` | `0x0051` | 5081 | 6081 |
| `LOAD_CAN_TIMEOUT` | `0x0052` | 5082 | 6082 |
| `LOAD_STATUS` | `0x007C` | 5124 | 6124 |
| `LOAD_ATTEMPTS` | `0x007D` | 5125 | 6125 |
| `LOAD_MAX_ATTEMPTS` | `0x007D` | 5125 | 6125 |
| `LastMode` | `0x007E` | 5126 | 6126 |
| `Commands` | `0x007F` | 5127 | 6127 |

File diff suppressed because one or more lines are too long

View File

@@ -1,9 +1,10 @@
# Назначение исходников Бальзам-167
Все редактируемые исходники C/H, ASM, CMD и Python используют UTF-8 без BOM.
Каждая строка кода снабжена русским пояснением. Существующие уведомления TI
и сведения о поставляемых файлах сохранены. Таблица покрытия и воспроизводимая
проверка находятся в [COMMENT_AUDIT.md](COMMENT_AUDIT.md) и
Русский текст найден рядом с каждой строкой исходников из Git-индекса, однако
часть пояснений шаблонная и требует содержательной доработки. Существующие уведомления TI
и сведения о поставляемых файлах сохранены. Таблица формального покрытия,
ограничения проверки и результаты проверки качества находятся в [COMMENT_AUDIT.md](COMMENT_AUDIT.md) и
../tests/comments/run_test.py.
## Порядок работы
@@ -29,7 +30,7 @@ Timer1 задаёт основную частоту READY_FREQ=1000 Гц. Для
| ADC.c | Настройка каналов АЦП, обработка преобразований и обновление фильтров. |
| measure.c | Типы датчиков, температурные/токовые/мощностные расчёты, диагностика, периодический такт. |
| filter_bat2.c | Накопительный фильтр; история и сумма обновляются вместе с новым отсчётом. |
| DAC.c | Передача слов ЦАП и автомат нагрузки: свежесть CAN, напряжение, STOP и максимум пять пусков. |
| DAC.c | Передача слов ЦАП и автомат нагрузки: свежесть CAN, напряжение, STOP и настраиваемый лимит пусков. |
| ecan.c | Штатные CAN-кадры и отдельный служебный обмен УМП/GAS; ISR принимает, главный цикл передаёт ответ. |
| RS485.c | SCI-A/SCI-B, разбор кадров и упаковка слов; FIFO используется только первым портом. |
| message.c | FC03/FC06, маршрутизация УМП/GAS, заводские и сохраняемые параметры. |
@@ -49,10 +50,13 @@ Timer1 задаёт основную частоту READY_FREQ=1000 Гц. Для
package.h определяет аппаратные адреса и псевдонимы modbus. Стартовый ток
находится в 0x50, конечный — в 0x51. Сохраняемый LOAD_CAN_TIMEOUT занимает 0x52:
разрешено 1..60000 мс; заводское значение 600 мс устанавливается Default_params.
разрешено 1..60000 мс; заводское значение 2000 мс устанавливается Default_params.
Setup_DAC_time исправляет недопустимое сохранённое значение на 600 мс.
Load_runner дополнительно использует 600 мс для локальной страховки при
недопустимом значении. LOAD_STATUS=0x7C и LOAD_ATTEMPTS=0x7D доступны для чтения.
недопустимом значении. LOAD_STATUS=0x7C доступен только для чтения.
LOAD_MAX_ATTEMPTS=0x7D — сохраняемый лимит 1..65535 пусков, по умолчанию 5;
ноль при записи отклоняется. Текущий счётчик остаётся в слове 5 блока
FC03(0x1300, 8), а подготовка тактов ЦАП не обнуляет настроенный лимит.
eeprom_config.h выбирает физическую микросхему при сборке. spise2p.h задаёт
ширину адреса, длину страницы и типы задания SPI. gas167.h описывает границы

View File

@@ -3,29 +3,33 @@
## Назначение и работа оператора
В SetGUI открыть ПМ35 → Настройки, выбрать COM, скорость (обычно 115200)
и адрес контроллера (обычно 16). Затем открыть вкладку **Логгер УМП**.
и адрес контроллера (для рассматриваемого УМП — 5). Затем открыть вкладку **Логгер УМП**.
Подключение используется существующее: прямой RS232/RS485 Modbus RTU.
CAN-команды от управляющего контроллера фиксируются самой платой нагрузки.
1. **Начать запись** включает только регистратор, не пуск УМП.
Период снимков по умолчанию 20 мс, диапазон 1–1000 мс.
2. Флажки выбирают отображаемые сигналы. Аналоги рисуются линиями,
2. Левые флажки выбирают отображаемые сигналы. Аналоги рисуются линиями,
дискретные сигналы — отдельными дорожками. Выбор не меняет состав
записи на плате: скрытую кривую можно включить после захвата.
3. **Онлайн** подключает график к уже идущей записи, в том числе после
восстановления соединения. Тайм-аут не посылает плате команду останова.
4. Фронт `cUMPreset` (бит 6 команды 0x7F) или спад `cUMPstart` (бит 7)
запускает фиксацию отключения. Ещё через 1000 тиков таймера / 1 секунду
банк становится архивом. Повторные команды внутри этой секунды
не продлевают интервал. Другие изменения команд не служат триггером.
4. Фактическое включение STOP при переходе работающей нагрузки к снятому
разрешению запускает фиксацию отключения. Постинтервал содержит 10%
банка — 76 последующих точек, включая события CAN и I/O. Повторные
STOP при уже остановленной нагрузке архив не заменяют.
5. **Прочитать отключение** загружает архив, не останавливая запись на плате.
На время чтения и просмотра архива онлайн-график приостанавливается;
вернуться к нему можно кнопкой **Онлайн**.
6. **Остановить и прочитать** останавливает только регистратор и читает
текущий банк. При этом существующий архив отключения остаётся доступным.
7. **Сохранить CSV** сохраняет все поля загруженного/онлайн-буфера,
включая невидимые кривые, время и код события. История GUI ограничена
800 последними точками; это не непрерывная запись на диск.
7. **Сохранить CSV** сохраняет поля загруженного/онлайн-буфера, выбранные
правыми флажками «Запись в лог», а также время и код события. Выбор
не зависит от видимости кривой. Множители графика не изменяют значения CSV.
**Буфер GUI** задаёт число последних точек: от 800 до 100000, по умолчанию
10000. Это отдельный буфер ПК, не ёмкость банка платы и не непрерывная
запись на диск. **Сохранить график из GUI** позволяет выгрузить накопленную
онлайн-историю после чтения архива платы.
При разрыве связи журнал на плате продолжает работать. Архив хранится в ОЗУ
до следующей фиксации отключения либо перезагрузки/пропадания питания.
@@ -35,23 +39,21 @@ EEPROM не используется: под отключением в этой
## Память и точность
Использована существующая секция `.logg` по адресу 0x200000: 64000
16-битных слов. Два банка по 760 записей × 42 слова занимают 63840 слов (160 слов свободны).
Текущий банк кольцевой. При триггере сохраняются последние до 379 записей,
добавляется событие отключения, оставшаяся половина банка отведена
постинтервалу. При 20 мс это до примерно 7.6 секунды до отключения и 1 секунды
после. Дополнительные события CAN и дискретов сокращают временную глубину.
При интенсивном потоке событий или периоде 1 мс постинтервал может заполнить
свои места раньше секунды. Последнее место зарезервировано под конечный
снимок; он помечается `event & 0x200`, и GUI сообщает об усечении.
Событие отключения и предыстория при этом не вытесняются.
16-битных слов. Два банка по 760 записей × 12 слов занимают 18240 слов.
Ёмкость в точках сохранена; сокращённая запись освобождает оставшуюся часть
выделенного массива. При триггере сохраняются до 683 предыдущих точек,
событие отключения и 76 последующих точек. При периоде 20 мс и отсутствии
дополнительных событий постинтервал составляет примерно 1,52 секунды.
События CAN и дискретов сокращают его временную длительность, но не число
зарезервированных точек. Архив после заполнения постинтервала фиксируется,
а запись продолжается в другом банке.
Время — 32-битный счётчик миллисекунд записи. Он идёт только при включённом
регистраторе и не является абсолютным временем. События в одном тике имеют
одинаковую отметку; порядок сохраняется порядком записей. На перезапуске
регистратора счётчик продолжает прежнюю шкалу, при перезагрузке платы — 0.
Онлайн-опрос возвращает две последние записи каждые 40 мс. Он не гарантирует
Онлайн-опрос возвращает до десяти последних записей каждые 40 мс. Он не гарантирует
передачу каждого события при высоком CAN-трафике, медленном UART или паузах
GUI. Номера записей позволяют убрать дубликаты и явно показать пропуски.
Полный сохранившийся фрагмент следует читать кнопкой архива. Частота 20 мс
@@ -63,55 +65,55 @@ GUI. Номера записей позволяют убрать дублика
EEPROM, выделения памяти или копирования целого банка. Реальную задержку
прерываний и длительность критических секций нужно измерить на F28335.
## Состав записи v3: 42 слова
## Состав записи v4: 12 слов
Из прошивки и списка графиков удалены 32 неотмеченных канала с двух
скриншотов: остатки импульса/инициализации, код и калибровки ЦАП,
измерения, ошибки, сырые CAN-слова/счётчики, маска команд, параметры
разгона и каналы АЦП. Рабочие калибровочные регистры и сами измерения
для управления платой продолжают использоваться по назначению.
В интерфейсе осталось 15 каналов:
| Группа | Каналы |
|---|---|
| Ток и уставки | Расчётное задание тока, начальная уставка, конечная уставка — мА |
| Напряжения | ЗПТ1: U1 + U2 (ПМ67, рег. 306); ЗПТ2: U3 + U4 (ПМ67, рег. 9) — В |
| Команды | Пуск УМП, сброс УМП |
| Входы | OMEGA, Start_1, Res_in |
| Выходы | START_DPTB, STOP_DPTB, RES_OUT_2 |
| События | Событие отключения, усечение постинтервала |
«Усечение постинтервала» оставлено для чтения прежних журналов; текущая
прошивка v4 бит 9 события не устанавливает. Расчётное задание тока —
команда аналоговому выходу, а не измеренный физический ток петли.
Для отображения физических единиц у пяти аналоговых каналов нужен
множитель ×1,000. Сохранённые пользовательские множители восстанавливаются
при запуске GUI; например, ×94,000 меняет только высоту кривой, не ток платы.
| Слова | Данные | Единицы/смысл |
|---|---|---|
| 0–1 | Время, младшее/старшее слово | мс записи |
| 2 | Событие | 1 период, 2 CAN RX, 3 изменение I/O, 4 RS-команда, 5 конец постинтервала |
| 2, бит 8 | Триггер отключения | флаг поверх причины события |
| 2, бит 9 | Усечён постинтервал | установлен в конечном снимке |
| 3 | Commands / modbus[0x7F] | все 16 бит, в том числе пуск, сброс, инициализация и калибровка ЦАП |
| 4 | Входы OMEGA, Start_1, Res_in | биты 0,1,2, активный уровень приведён к 1 |
| 5 | START_DPTB, STOP_DPTB, RES_OUT_2 | биты 0,1,2, активный уровень приведён к 1 |
| 6 | IMPowse | остаток импульса, мс |
| 7 | WAKEpowse | остаток инициализации, тики DAC_FREQ |
| 8 | modbus[0x7B] | 12-битный код, переданный функцией dSEND в ЦАП |
| 9 | modbus[0x1C] | расчётное задание в 0.1 мА; GUI/CSV переводит в мА |
| 10–13 | sens_data[0..3] | измеренные сигналы, знаковое 16-битное значение в исходном масштабе |
| 14–17 | modbus[0..3] | маски ошибок измерений |
| 18 | CAN заголовок | адрес регистра в младших 13 битах и маска трёх слов в старших |
| 19–21 | Три слова последнего принятого CAN-кадра | без преобразования |
| 22 | Счётчик записанных CAN RX | младшие 16 бит |
| 23 | CanTimeOutErrorTR | младшие 16 бит счётчика тайм-аутов CAN TX |
| 24–25 | DAC_go, DAC_stop | исходные начальная/конечная уставки, мА |
| 26–28 | DAC_min(), DAC_max(), DAC_cal() | коды калибровки и ручного задания ЦАП |
| 29–30 | DAC_04, DAC_20 | значения соответствующих регистров |
| 31–32 | count_load, time_dac | положение и длительность разгона в тиках |
| 33–34 | эффективные dac_go/dac_stop + 4 | 0.1 мА после ограничений алгоритма; GUI переводит в мА |
| 35 | kod | целочисленное положение, используемое Anal_output |
| 36–39 | ADC_table[0..3] | значения таблицы АЦП в исходном масштабе прошивки |
| 40 | ЗПТ1: U1 + U2, ПМ67 регистр 306 / индекс 305 | исходное 16-битное слово без пересчёта |
| 41 | ЗПТ2: U3 + U4, ПМ67 регистр 9 / индекс 8 | исходное 16-битное слово без пересчёта |
| 2 | Событие | 1 — период, 2 — CAN, 3 — I/O, 4 — RS, 5 — конец постинтервала |
| 2, бит 8 | Событие отключения | флаг поверх причины |
| 2, бит 9 | Усечение постинтервала | совместимость со старыми журналами; в текущем v4 равен 0 |
| 3 | Команды пуска и сброса | только биты 7 и 6; отдельной кривой маски команд больше нет |
| 4 | Входы OMEGA, Start_1, Res_in | биты 0, 1, 2 |
| 5 | Выходы START_DPTB, STOP_DPTB, RES_OUT_2 | биты 0, 1, 2 |
| 6 | Расчётное задание тока | 0,1 мА; GUI/CSV показывает мА |
| 7–8 | Начальная/конечная уставки | целые мА |
| 9–10 | ЗПТ1/ЗПТ2 | беззнаковые слова, масштаб 1 В/ед. |
| 11 | Нулевой резерв | чётная длина для передачи CAN парами слов |
Напряжения принимаются из технологических CAN-кадров с нулевыми индексами
305 и 8. Учитываются все три позиции и биты маски 0x8000/0x4000/0x2000.
Они хранятся отдельно от массива modbus[0..127], обновляются и при выключенном
логгере. Запись содержит последние принятые значения; до первого приёма — 0.
При потере связи остаётся последнее значение: отдельного признака свежести нет.
Масштаб и знаковость физического напряжения не заданы исходной таблицей;
SetGUI показывает исходное беззнаковое слово, коэффициент задаётся в интерфейсе.
**Отправленный код ЦАП не является измеренным током выхода.** В этом проекте
не установлено, какой вход аппаратно измеряет ток ЦАП. При включённом
`cCalibrDac` отправляется `DAC_cal()`, а расчётное задание 0x1C остаётся
результатом алгоритма разгона. Для диагностики это различие сохранено.
ADC_table также уже обрабатывается существующим измерительным кодом;
это не обязательно необработанный регистр ADCRESULT.
Управляющая логика не исправлялась. Например, существующая строка
`if(dac_stop>16) dac_go=16;` в Load_runner сохранена; журнал показывает
фактически получившиеся эффективные уставки, чтобы выявить такое поведение.
Клиент не преобразует напряжения в знаковые измерения. Свежесть выбранного
ЗПТ и защита роста напряжения описаны отдельно в `UMP_VOLTAGE_PROTECTION.md`.
При штатных 6 мА пуск сначала передаёт это задание и получает 3 секунды
на рост ЗПТ до 30 В; после этого работает прежняя защита и лимит попыток.
## Протокол расширения Modbus
@@ -126,16 +128,16 @@ FC03, 0x1000, 16 слов:
| Смещение | Значение |
|---|---|
| 0,1 | 0x554D, версия 3 |
| 0,1 | 0x554D, версия 4 |
| 2,3 | состояние и число записей выбранного источника |
| 4,5 | 42 слова в записи, 760 записей в банке |
| 4,5 | 12 слов в записи, 760 записей в банке |
| 6 | период периодических снимков, мс |
| 7,8 | счётчик времени, младшее/старшее слово |
| 9,10 | Desk (требуется 6 / dsk_LOAD), Mode |
| 11 | частота временной базы, 1000 Гц |
| 12 | поколение архива, mod 65536 |
| 13 | число записей архива |
| 14 | оставшиеся миллисекунды постинтервала |
| 14 | верхняя оценка оставшихся миллисекунд: число точек × период, до 65535 |
| 15 | состояние текущего регистратора независимо от выбора источника |
Состояния: 0 — ещё не запущен, 1 — запись, 3 — остановлен/архив.
@@ -146,40 +148,45 @@ FC06:
- 0x1002: хронологический индекс первой записи окна 0..759;
- 0x1003: источник окна, 0 — текущий остановленный банк, 1 — архив отключения.
FC03, 0x1010, до 120 слов: окно от установленного индекса; для целых записей v3 читать 42 или 84 слова.
CAN допускает 42/84 и прежние размеры 40/80/120; RTU допускает 1..120 слов.
FC03, 0x1010, до 120 слов: окно от установленного индекса; для целых записей v4 читать 12, 24, …, 120 слов.
CAN допускает кратные 12 до 120 слов и прежние размеры v2/v3; RTU допускает 1..120 слов.
Чтение текущего банка этим окном во время записи не выдаёт изменяющиеся
данные. GUI сначала останавливает его; архив можно читать при работающем
текущем банке. После всех блоков GUI повторно проверяет поколение архива;
при замене во время чтения результат не подменяет предыдущий график.
FC03, 0x1100, ровно 124 слова: онлайн-блок. Слова 0,1 — 32-битный номер
первой записи, 2 — число записей 0..2, 3 — поколение архива, далее до двух
записей по 42 слова. Неиспользованные слова равны нулю. Окно онлайн не
первой записи, 2 — число записей 0..10, 3 — поколение архива, далее до десяти
записей по 12 слов. Неиспользованные слова равны нулю. Окно онлайн не
зависит от курсора/выбора архива. Разделение 0x1010 и 0x1100 предотвращает
пересечение двух окон.
Недопустимые диапазоны и значения возвращают исключения Modbus 2/3.
CRC и разбор стандартного ответа GUI используют существующее общее ядро.
SetGUI распознаёт v2 (40 слов, 800 записей) и v3 (42 слова, 760 записей).
Для v2 новые напряжения недоступны (NaN), для v3 доступны графики и CSV.
CAN-валидация общей библиотеки расширена размерами 42/84 слова.
SetGUI распознаёт v2 (40 слов, 800 записей), v3 (42 слова, 760 записей)
и v4 (12 слов, 760 записей). Для v2 ЗПТ недоступны (NaN). Старые архивы
декодируются по прежним индексам, но удалённые каналы в панели и CSV больше
не создаются. Валидаторы RTU/CAN поддерживают компактные размеры записи.
Исходники протокола подключаются к прошивке из templates/c/set-protocol.
## Проверка и запуск
Полная сборка исправления: `./build_logger.ps1`. По умолчанию используется
`../newProject/SETGUI/third_party/templates`; другую копию можно указать
параметром `-TemplatesRoot`. В ней нужны `c/set-protocol/src/ump_protocol.c`
и `c/set-protocol/ports/tms320f28335/ump_tms28335.c` (порт УМП v3).
Само наличие папки templates не гарантирует наличие этого порта.
Результат — `Bin/LoggerFix/UKSSTMS320F28335_logger_fix.bin` (SCI8 boot),
рядом OUT и MAP. Старые образы в Bin не заменяются.
Скрипт использует TI C2000 22.6 COFF, оптимизацию размера и секции функций;
таблица `.cinit` размещена в RAML4 вместе с константами, код — в RAML0.
Для сборки из CCS добавьте `Source/Internal/shared_ump.c` в проект и каталоги
`<templates>/c/set-protocol`, `<templates>/c/set-protocol/ports/tms320f28335`
в include path; используйте параметры оптимизации из скрипта.
Текущая проверенная сборка с пуском 3 секунды и сокращённым журналом:
`Bin/StartupWait3s/UKSSTMS320F28335_startup_3s_378e06a+.bin`.
Размер — 32180 байт; для AT25256B допустимы 32508 байт, запас — 328 байт.
Рядом находятся OUT, MAP, манифест и SHA-256. Для чтения v4 используйте
обновлённый SETGUI и перезапустите приложение после изменения исходников.
Воспроизводимая сборка из корня проекта: `python Bin/StartupWait3s/rebuild.py`.
Скрипт использует установленный TI C2000 22.6, ABI COFF, `-O2`,
`--opt_for_speed=0` и секции функций. Все модули пересобираются в отдельный
каталог; до формирования готового BIN проверяются профиль AT25256B,
граница 32508 байт, блоки RAM и точка входа SCI8. Сохраняются паспорт и SHA-256.
Из CCS используется та же карта памяти и настройки проекта. В include-path
нужны каталоги общего `c/set-protocol`, его порта `ports/tms320f28335`
и сгенерированного паспорта. Обе используемые копии библиотеки поддерживают v4:
`../newProject/templates` и `../newProject/SETGUI/third_party/templates`.
При загрузке `main()` вызывает `ump_log_init()` до включения прерываний.
Это обязательно для TI COFF: стартовый код не обнуляет неинициализированные
@@ -191,29 +198,31 @@ FC06 не вызывает загрузочную инициализацию и
запуск с ненулевой RAM и отрицательный контроль без инициализации;
внешняя библиотека `templates/c/set-protocol` для этого теста не нужна.
Изменены исходники прошивки и SetGUI. Готовый образ в Bin не обновлялся.
Для платы необходима сборка штатным TI C2000/CCS, проверка размещения .text,
.stack, .ebss и .logg по MAP, прошивка и испытание на стенде.
Изменены исходники прошивки и SetGUI; новый образ собран в отдельном каталоге.
Проверены TI-компиляция, линковка и формат SCI8 для AT25256B. Физические
уровни GPIO и ток после загрузки образа проверяются на плате.
Автотест C в tests/ump_logger компилирует непосредственно log_to_mem.c
с подменой GPIO/IRQ. Проверяет кольцо, граничные адреса, обе команды
отключения, защиту триггера от переполнения, переключение банков,
сохранность архива во время дальнейшей записи и контрольные поля CAN/ЦАП.
сохранность архива во время дальнейшей записи, токовое задание и оба ЗПТ.
Это проверка алгоритма на компьютере, не проверка таймингов и 16-битной ABI
TI. Отдельно выполнена синтаксическая проверка изменённых C-файлов Clang
с исходными заголовками и декларациями TI-интринсиков.
Тесты SetGUI: tests/test_ump_logger.py и tests/test_periph28335_tab.py.
Проверенный набор SetGUI: `tests/test_ump_logger.py`,
`tests/test_ump_logger_can.py`, `tests/test_ump_voltage_protection.py` — 93 теста.
Они проверяют единицы мА, битовые сигналы, временные метки, несовместимую
прошивку, порядок команд, архив при активной записи, замену поколения,
дубликаты/пропуски онлайн, потерю связи и флажки графиков.
Проверка на стенде: включить запись → подать CAN-пуск → изменить уставку →
подать откл. → через секунду прочитать архив → сверить код ЦАП, ток внешним
измерителем и физические входы/выходы; затем повторить с разрывом RS.
подать откл. → дождаться заполнения 76 точек постинтервала → прочитать
архив и сверить задание, внешний ток и дискретные уровни; затем повторить
с разрывом RS.
Период 1 мс проверить отдельно под максимальной CAN-нагрузкой.
Для сборки v3 нужен templates/main начиная с коммита c0ee7c4
Исторически для сборки v3 требовался templates/main начиная с коммита c0ee7c4
(поддержка CAN-чтения 42/84 слов и порт TMS320F28335).
## Пересечение образа 34a95bc5 с параметрами EEPROM
@@ -239,3 +248,22 @@ TI. Отдельно выполнена синтаксическая прове
При превышении границы остаётся только файл `.pending`; готовый BIN
не публикуется. Проверка: `python tests/ump_logger/test_firmware_image.py`.
После перепрошивки требуется проверка на плате; проверка на ПК её не заменяет.
## Исправление ожидания EEPROM при запуске через CCS
В сборке CCS с O3 подтверждён перенос записей полей `readData` и `writeData`
за цикл ожидания `spiSe2pFree()`. Указатель `msgPtr` и флаг `csr` были volatile,
но содержимое дескриптора — нет. Timer2 получал запрос с незаполненными
адресом, длиной и указателем буфера, поэтому `Load_params()` мог не завершиться,
хотя UART уже принял команду. Все три поля `SE2P_DATA` теперь volatile.
В дизассемблере исправленного OUT записи всех полей предшествуют флагу запроса.
Для проверки старой AT25256B подготовлен
`Bin/EepromPublishFix/UKSSTMS320F28335_eeprom_fix.out` и одноимённый BIN с build_id.
Сборка `python Bin/EepromPublishFix/rebuild.py` явно задаёт `EEPROM_M95M02=0`
и O3; размер проверенного BIN — 32074 байта, запас до параметров — 434 байта.
Проверка порядка инструкций:
`python tests/eeprom_profiles/check_publication.py Bin/EepromPublishFix/disassembly.txt`.
На листинге прежнего OUT эта проверка падает, на исправленном проходит для чтения
и записи. Пройдены модели обоих профилей EEPROM и UART. Запуск на плате
после загрузки исправленного OUT ещё требует подтверждения.

View File

@@ -13,7 +13,21 @@
или удерживаемом STOP.
Если очередной шаг рампы требует **строго больше 6 мА**, а свежее
CAN-напряжение меньше 30 В, шаг не передаётся в ЦАП. Вместо него:
CAN-напряжение меньше 30 В и в текущей попытке ещё не достигало порога,
в ЦАП сначала передаётся задание **6 мА**. Положение рампы удерживается.
УМП получает **3 секунды** на рост ЗПТ до 30 В: это 600 отправленных
токовых кадров при 200 Гц. Отсчёт начинается с первой отправки 6 мА;
команда инициализации ЦАП не расходует выдержку. До достижения порога
даже начальная уставка выше 6 мА ограничивается этим током. Уставки
ниже 6 мА сначала проходят обычный разгон до указанной границы.
При свежем ЗПТ **не меньше 30 В** разгон продолжается с сохранённого
положения без нового START. После подтверждённого роста напряжения
рабочая защита снова действует сразу: шаг выше 6 мА при ЗПТ ниже 30 В
не передаётся в ЦАП и не получает повторной стартовой выдержки.
Если за 3 секунды свежего обмена ЗПТ не достигло 30 В либо напряжение
упало после успешного пуска, вместо повышенного задания выполняется:
1. Снимается START, включается STOP, снимается разрешение RES_OUT_2.
2. Положение рампы обнуляется, передаётся код 4 мА без подмены калибровкой.
@@ -21,12 +35,23 @@ CAN-напряжение меньше 30 В, шаг не передаётся в
4. Когда код 4 мА отправлен, прошла секунда и есть свежее ЗПТ,
снимается STOP, сразу выставляется START, затем разрешение.
5. Новая рампа начинается с нулевого положения с исходными уставками
`DAC_go`/`DAC_stop` (штатные значения могут начинать рост с 6 мА).
`DAC_go`/`DAC_stop`; новая попытка получает собственные 3 секунды
ожидания при 6 мА, если ЗПТ ещё не достигло 30 В.
Первый START входит в лимит: **всего 5 попыток**, не 5 дополнительных.
После пятой неудачной попытки удерживаются STOP и 4 мА, разрешение снято,
шестой START не выдаётся. Ошибка снимается командой `cUMPstart=0`;
затем можно подать новый пуск. Команда RESET имеет приоритет перед START.
Первый START входит в настраиваемый лимит регистра **0x7D**: по умолчанию
**всего 5 попыток**, не 5 дополнительных. Через FC06 или штатный CAN можно
записать **1…65535**; ноль отклоняется без изменения предыдущей настройки.
После последней разрешённой неудачи удерживаются STOP и 4 мА, разрешение
снято, дополнительный START не выдаётся. Ошибка снимается командой `cUMPstart=0`;
затем можно подать новый пуск. Изменение лимита само по себе не снимает
ошибку и не выдаёт START. Уменьшение лимита во время STOP проверяется перед
следующей попыткой. Команда RESET имеет приоритет перед START.
Для задания пяти пусков используйте `FC06(0x007D, 5)` либо `FC06(0x507D, 5)`
в GAS-профиле M95M02. Чтение `0x7D` возвращает лимит; текущий счётчик остаётся
в слове 5 диагностического блока `FC03(0x1300, 8)`. Настройка сохраняется
штатной командой **Save**. Ноль из старой EEPROM заменяется на 5 при запуске;
ненулевое сохранённое значение трактуется как лимит.
Отпускание RESET с оставшимся START=1 само по себе не перезапускает УМП.
Выходами и рампой управляет один обработчик Timer1 (1 мс). Основной цикл
@@ -36,14 +61,16 @@ CAN-напряжение меньше 30 В, шаг не передаётся в
## Отсутствие CAN
Таймаут по умолчанию **600 мс**, диапазон настройки **1…60000 мс**.
Заводской таймаут из `Default_params` — **2000 мс**, диапазон настройки **1…60000 мс**. Если сохранённый параметр недопустим, `Setup_DAC_time` применяет **600 мс**; такой же запасной таймаут используется локально в `Load_runner`.
Свежесть подтверждается только получением нужного ЗПТ в полном
технологическом CAN-кадре с соответствующим битом маски. Другое
напряжение, сервисные запросы, команды и произвольные CAN-пакеты
таймаут не сбрасывают. До первого значения напряжение считается неизвестным.
При таймауте работающая рампа удерживает последнее положение и отправленный
код. Попытка не считается неудачной, STOP по одному таймауту не включается.
код. Стартовая выдержка при 6 мА также приостанавливается и возобновляется
после нового выбранного ЗПТ. Попытка не считается неудачной, STOP по одному
таймауту не включается.
После свежего ЗПТ рост продолжается; если оно меньше 30 В при задании
больше 6 мА, выполняется защитный STOP. Если обмен исчез во время
сброса, STOP держится и после секунды — до свежего напряжения.
@@ -76,9 +103,9 @@ CAN-напряжение меньше 30 В, шаг не передаётся в
Старые прошивки без блока защиты продолжают обычное онлайн-чтение;
эмуляция для них недоступна.
Технологические регистры только для чтения: `0x7C` — статус,
`0x7D` — число попыток. Оба включены в быстрый CAN-цикл.
Статус: бит 0 — ошибка пяти попыток, бит 1 — нет свежего ЗПТ,
Технологический регистр `0x7C` — статус только для чтения;
`0x7D` — записываемый сохраняемый лимит попыток. Оба включены в быстрый CAN-цикл.
Статус: бит 0 — ошибка исчерпания настроенного лимита, бит 1 — нет свежего ЗПТ,
бит 2 — сброс перед повтором, бит 3 — работа рампы,
биты 4/5 — активная эмуляция отсутствия CAN/роста ЗПТ.
@@ -103,7 +130,11 @@ FC06 допускает запись только `0x1302` (0…3) и `0x1303` (
`python tests/load_control/run_test.py` компилирует непосредственно
`DAC.c` с подменой GPIO/IRQ. Проверяются выбор ЗПТ, маски CAN, таймаут,
удержание кода, граница 30 В, порядок STOP/START, точная пауза 1000 мс,
лимит пяти пусков, RESET, эмуляция и невозможность подмены 4 мА калибровкой.
лимиты 1, 2, 5, 7 и 65535 пусков, изменение лимита во время STOP, RESET, эмуляция и невозможность подмены 4 мА калибровкой.
Стартовые регрессии для адресов 5 и 6 проверяют отправку 6 мА вместо
мгновенного сброса, границу выдержки 3000 мс, успешный рост ЗПТ во время
ожидания, немедленную защиту после успешного пуска, повышенную начальную
уставку, паузу CAN и пропуск отсчёта при инициализации ЦАП.
GUI: `tests/test_ump_voltage_protection.py` в SETGUI плюс регрессии логгера.
Сборка: `build_logger.ps1 -OutputDirectory Bin/VoltageProtection

View File

@@ -51,13 +51,15 @@ unsigned int period_dac, time_dac;
#define LOAD_RELOAD 2U
/* Задаёт LOAD_FAULT = 3U; состояние остановки после исчерпания попыток. */
#define LOAD_FAULT 3U
/* Задаёт LOAD_MAX_ATTEMPTS = 5U; предел повторных пусков нагрузки — пять. */
#define LOAD_MAX_ATTEMPTS 5U
/* Задаёт LOAD_VOLTAGE_MIN = 30U; минимальное разрешённое напряжение нагрузки — 30 В. */
#define LOAD_VOLTAGE_MIN 30U
/* Задаёт LOAD_PULSE_MS = 1000U; длительность удержания импульса START/STOP — 1000 мс. */
#define LOAD_PULSE_MS 1000U
/* Объявляет load_state — текущее состояние автомата нагрузки; load_attempts — накопленное число пусков в текущем цикле, максимум пять; load_inhibit — признак запрета повторного запуска до требуемого перехода входов. */
/* Стартовая выдержка 3 секунды выбрана для реакции УМП и обновления ЗПТ; при DAC_FREQ=200 Гц это 600 отправок задания 6 мА. */
#define LOAD_START_WAIT_STEPS (3U * DAC_FREQ)
/* load_start_remaining хранит остаток 600 стартовых отправок 6 мА; ноль означает конец выдержки или подтверждённые 30 В. */
static unsigned int load_start_remaining;
/* Хранит состояние автомата, число выданных START в текущем сеансе и запрет повторного пуска; лимит берётся отдельно из регистра 0x7D. */
static unsigned int load_state, load_attempts, load_inhibit;
/* Объявляет load_count_dac — load число ЦАП; load_count_ramp — load число ramp; load_init_count — load init число. */
static unsigned int load_count_dac, load_count_ramp, load_init_count;
@@ -78,6 +80,8 @@ void Load_control_init(void)
{
/* Записывает load_state значением LOAD_IDLE; load_attempts = 0; load_inhibit = 0; текущее состояние автомата нагрузки. */
load_state = LOAD_IDLE; load_attempts = 0; load_inhibit = 0;
/* Начинает первую попытку без накопленной выдержки и подтверждённого роста ЗПТ; COFF требует явной инициализации статических полей. */
load_start_remaining = 0;
/* Записывает load_count_dac значением 0; load_count_ramp = 0; load_init_count = 1; load число ЦАП. */
load_count_dac = 0; load_count_ramp = 0; load_init_count = 1;
/* Записывает load_zero_sent значением 0; load_stop_asserted = 0; load_initialized = 0; данные load_zero_sent. */
@@ -178,10 +182,8 @@ static void load_start(void)
if (load_end > 16) load_end = 16;
/* Проверяет if (load_end <= load_go) load_end = load_go + 1; последующий оператор выполняется только при истинном условии. */
if (load_end <= load_go) load_end = load_go + 1;
/* Записывает ump_dac_go10 значением (unsigned int)((load_go + 4.0) * 10.0); ump ЦАП go 10. */
ump_dac_go10 = (unsigned int)((load_go + 4.0) * 10.0);
/* Записывает ump_dac_stop10 значением (unsigned int)((load_end + 4.0) * 10.0); ump ЦАП stop 10. */
ump_dac_stop10 = (unsigned int)((load_end + 4.0) * 10.0);
/* Каждая попытка получает 600 токовых тактов, то есть 3 секунды при 200 Гц; остаток уменьшается только после отправки 6 мА. */
load_start_remaining = LOAD_START_WAIT_STEPS;
/* Записывает load_count_ramp значением 0; load число ramp. */
load_count_ramp = 0;
/* Изменяет счётчик в выражении load_attempts++; на один для следующего шага. */
@@ -220,8 +222,10 @@ void Setup_DAC_time(void)
if ((unsigned int)LOAD_CAN_TIMEOUT == 0U ||
/* Записывает LOAD_CAN_TIMEOUT значением 600; сохраняемый тайм-аут свежести напряжения CAN в миллисекундах, регистр 0x52. */
(unsigned int)LOAD_CAN_TIMEOUT > 60000U) LOAD_CAN_TIMEOUT = 600;
/* Записывает LOAD_STATUS значением 0; LOAD_ATTEMPTS = 0; слово состояния защиты нагрузки для чтения, регистр 0x7C. */
LOAD_STATUS = 0; LOAD_ATTEMPTS = 0;
/* Старый нулевой счётчик в EEPROM заменяется заводским лимитом пяти пусков; ненулевую сохранённую настройку 0x7D не стираем. */
if (!(unsigned int)LOAD_MAX_ATTEMPTS) LOAD_MAX_ATTEMPTS = LOAD_DEFAULT_MAX_ATTEMPTS;
/* Сбрасывает диагностическое слово 0x7C при подготовке автомата; сохраняемый лимит не является текущим счётчиком. */
LOAD_STATUS = 0;
/* Записывает load_initialized значением 1; данные load_initialized. */
load_initialized = 1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
@@ -297,16 +301,16 @@ static void anal_output(long vrot, long maxx, int calibration)
/* Объявляет x — данные x. */
static int x;
/* Записывает out значением DAC_min() + vrot * DAC_max() / maxx - vrot * DAC_min() / maxx ; данные out. */
/* Линейно переводит долю рампы vrot/maxx в код между DAC_min() и DAC_max(); целочисленное деление каждого слагаемого задаёт округление. */
out = DAC_min() + vrot * DAC_max() / maxx - vrot * DAC_min() / maxx ;
/* Записывает x значением 0; данные x. */
/* Фиксирует выбор нижней ветви передачи: при x=0 далее используется управляющее слово out|0x8000. */
x=0;// !x; тщетно бытие
/* Проверяет if(calibration и cCalibrDac) out=DAC_cal(); последующий оператор выполняется только при истинном условии. */
if(calibration && cCalibrDac) out=DAC_cal();
/* Записывает out значением out & 0xFFF; данные out. */
/* Оставляет младшие 12 бит кода ЦАП. Это усечение битов, а не насыщение на границах 0..4095. */
out = out & 0xFFF;
/* Проверяет if(x) dSEND(out|0x0000|0x0000); последующий оператор выполняется только при истинном условии. */
@@ -314,10 +318,10 @@ static void anal_output(long vrot, long maxx, int calibration)
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else dSEND(out|0x8000|0x0000);
/* Записывает modbus[123] значением out; массив технологических регистров; слово int на C28x занимает 16 бит. */
/* Публикует фактически отправляемый 12-битный код ЦАП в технологическом регистре 0x7B для диагностики и регистрации. */
modbus[123] = out;
/* Записывает modbus[0x1C] значением 40L + vrot * 200 / maxx - vrot * 40 / maxx ; массив технологических регистров; слово int на C28x занимает 16 бит. */
/* Публикует расчётный выход 4..20 мА в масштабе 0,1 мА на единицу: при доле рампы 0 значение 40, при доле 1 значение 200. */
modbus[0x1C] = 40L + vrot * 200 / maxx - vrot * 40 / maxx ;
/*
@@ -352,10 +356,10 @@ void Anal_output(long vrot, long maxx)
void Load_runner(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет saved — данные saved; commands — данные commands; voltage — данные voltage; fresh — данные fresh; timeout — данные timeout. */
unsigned int saved, commands, voltage, fresh, timeout;
/* Объявляет start — данные start; reset — сброс; active — данные active. Начальное значение задаётся справа от знака равенства. */
unsigned int start, reset, active = 0;
/* Хранит состояние IRQ, снимки команд и напряжения, свежесть CAN, тайм-аут в мс и лимит пусков; 16-битный лимит читается один раз за такт. */
unsigned int saved, commands, voltage, fresh, timeout, attempt_limit;
/* start/reset хранят командные биты; active отмечает работу; voltage_wait отмечает вывод 6 мА; ramp_before позволяет заморозить положение рампы. */
unsigned int start, reset, active = 0, voltage_wait = 0, ramp_before;
/* Объявляет sinus — данные sinus. Начальное значение задаётся справа от знака равенства. */
float sinus = 0;
@@ -371,6 +375,10 @@ void Load_runner(void)
voltage = (load_simulation & 2U) ? 0U : load_voltage;
/* Записывает timeout значением (unsigned int)LOAD_CAN_TIMEOUT; данные timeout. */
timeout = (unsigned int)LOAD_CAN_TIMEOUT;
/* Читает 0x7D как беззнаковое 16-битное число, чтобы значения 32768..65535 сохраняли положительный смысл лимита. */
attempt_limit = (unsigned int)LOAD_MAX_ATTEMPTS;
/* При нештатном нуле в RAM оставляет прежний предел пяти пусков; штатные обработчики записи ноль отклоняют. */
if (!attempt_limit) attempt_limit = LOAD_DEFAULT_MAX_ATTEMPTS;
/* Проверяет if (!timeout или timeout > 60000U) timeout = 600U; последующий оператор выполняется только при истинном условии. */
if (!timeout || timeout > 60000U) timeout = 600U;
/* До первого пакета значение 0 не считается свежим измерением.
@@ -393,7 +401,7 @@ void Load_runner(void)
if (!start) {
/* Проверяет if (load_state != LOAD_IDLE) load_stop(LOAD_IDLE); последующий оператор выполняется только при истинном условии. */
if (load_state != LOAD_IDLE) load_stop(LOAD_IDLE);
/* Записывает load_attempts значением 0; load_inhibit = 0; накопленное число пусков в текущем цикле, максимум пять. */
/* Снятие START обнуляет счётчик текущего сеанса и запрет повторного пуска, сохраняя настроенный лимит в 0x7D. */
load_attempts = 0; load_inhibit = 0;
/* Проверяет else if (reset); последующий оператор выполняется только при истинном условии. */
} else if (reset) {
@@ -408,13 +416,15 @@ void Load_runner(void)
/* Проверяет if (reset и !load_stop_asserted) load_stop(LOAD_IDLE); последующий оператор выполняется только при истинном условии. */
if (reset && !load_stop_asserted) load_stop(LOAD_IDLE);
/* LOAD_RELOAD уже удерживает STOP, 4 мА и снятое разрешение; уменьшение лимита только фиксирует ошибку, не перезапуская секундную выдержку. */
if (load_state == LOAD_RELOAD && load_attempts >= attempt_limit) load_state = LOAD_FAULT;
/* Повторный START допускается после сброса ЦАП, окончания STOP и
* восстановления нужного CAN-напряжения. Таймаут сам не тратит попытку. */
/* Проверяет if (start и !reset и !load_inhibit и !WAKEpowse и fresh и; последующий оператор выполняется только при истинном условии. */
/* Команда START без RESET и запрета должна дождаться окончания инициализации, свежего ЗПТ и подтверждённого задания 4 мА. */
if (start && !reset && !load_inhibit && !WAKEpowse && fresh &&
/* Продолжает список аргументов, полей или выражение load_zero_sent && !IMPowse &&; порядок элементов сохраняется. */
/* Секундный STOP заканчивается только после передачи исходного кода ЦАП; обе выдержки обязательны перед пуском. */
load_zero_sent && !IMPowse &&
/* Продолжает список аргументов, полей или выражение (load_state == LOAD_IDLE || load_state == LOAD_RELOAD)) load_start();; порядок элементов сохраняется. */
/* LOAD_IDLE начинает сеанс с нулевым счётчиком, а LOAD_RELOAD проверен на оставшиеся попытки выше; ошибка не разрешает START. */
(load_state == LOAD_IDLE || load_state == LOAD_RELOAD)) load_start();
/* Проверяет if (load_state == LOAD_RUN и !IMPowse) clear_START_DPTB(); последующий оператор выполняется только при истинном условии. */
if (load_state == LOAD_RUN && !IMPowse) clear_START_DPTB();
@@ -439,34 +449,43 @@ void Load_runner(void)
active = load_state == LOAD_RUN;
/* Проверяет if (active); последующий оператор выполняется только при истинном условии. */
if (active) {
/* При таймауте сохраняем положение И отправленное задание,
* не делаем STOP и не продолжаем разгон без обратной связи. */
/* Проверяет if (fresh); последующий оператор выполняется только при истинном условии. */
/* В паузе CAN не вычисляет следующий шаг: положение, код и остаток стартовой выдержки сохраняются. */
if (fresh) {
/* Проверяет if (load_count_ramp > time_dac / 2) load_count_ramp++; последующий оператор выполняется только при истинном условии. */
/* Сохраняет положение до шага, чтобы отменить рост на время начального ожидания при 6 мА. */
ramp_before = load_count_ramp;
/* Во второй половине штатной рампы сохраняет прежнее ускорение на два отсчёта за токовый такт. */
if (load_count_ramp > time_dac / 2) load_count_ramp++;
/* Проверяет if (++load_count_ramp > time_dac) load_count_ramp = time_dac; последующий оператор выполняется только при истинном условии. */
/* Продвигает рампу на один отсчёт и ограничивает её концом, заданным LOAD_TIME и DAC_FREQ. */
if (++load_count_ramp > time_dac) load_count_ramp = time_dac;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает sinus значением ((load_end - load_go) / 16.0 * load_count_ramp) +; данные sinus. */
sinus = ((load_end - load_go) / 16.0 * load_count_ramp) +
/* Продолжает список аргументов, полей или выражение (load_go / 16.0 * time_dac);; порядок элементов сохраняется. */
(load_go / 16.0 * time_dac);
/* Проверяем следующий шаг ДО передачи ЦАП. 6 мА допустимы,
* строго >6 мА и <30 В требуют немедленного STOP.
* Первая попытка входит в лимит 5; шестого START не будет. */
/* Проверяет if (fresh и voltage < LOAD_VOLTAGE_MIN и; последующий оператор выполняется только при истинном условии. */
if (fresh && voltage < LOAD_VOLTAGE_MIN &&
/* Продолжает список аргументов, полей или выражение sinus * 16.0 > 2.0 * time_dac) {; порядок элементов сохраняется. */
sinus * 16.0 > 2.0 * time_dac) {
/* Вызывает load_stop. Снимает START и разрешение нагрузки, удерживает STOP 1000 мс и сбрасывает состояние нарастания тока. */
load_stop(load_attempts >= LOAD_MAX_ATTEMPTS ?
/* Продолжает список аргументов, полей или выражение LOAD_FAULT : LOAD_RELOAD);; порядок элементов сохраняется. */
LOAD_FAULT : LOAD_RELOAD);
/* Записывает active значением 0; sinus = 0; данные active. */
active = 0; sinus = 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
/* Преобразует продвижение рампы в долю полного токового диапазона 16 мА с учётом начальной уставки. */
sinus = ((load_end - load_go) / 16.0 * load_count_ramp) +
/* Добавляет начальную уставку относительно базовых 4 мА в тех же единицах положения рампы. */
(load_go / 16.0 * time_dac);
/* Подтверждённые 30 В завершают стартовое ожидание; последующее падение ЗПТ не получает новую выдержку. */
if (voltage >= LOAD_VOLTAGE_MIN) load_start_remaining = 0;
/* При меньшем ЗПТ внутренние 2 мА поверх базовых 4 мА ограничивают следующее задание суммарными 6 мА. */
else if (sinus * 16.0 > 2.0 * time_dac) {
/* До подтверждения порога даёт попытке остаток выбранных 3 секунд, не отправляя повышенный ток. */
if (load_start_remaining) {
/* Отменяет шаг рампы во время ожидания, чтобы после роста ЗПТ продолжить с прежнего положения. */
load_count_ramp = ramp_before;
/* Доля 1/8 диапазона 16 мА добавляет 2 мА к базовым 4 мА; time_dac=6000 даёт положение 750. */
sinus = time_dac / 8.0;
/* Отсчитывает выдержку только после отправки задания; служебная инициализация ЦАП не расходует её. */
voltage_wait = 1;
/* Исчерпанная выдержка или падение напряжения после успешного роста требуют немедленного STOP. */
} else {
/* Возвращает 4 мА и снимает разрешение; исчерпание сохранённого лимита попыток запрещает следующий пуск. */
load_stop(load_attempts >= attempt_limit ?
/* Использует согласованный снимок лимита текущего такта; заводские пять пусков сохраняют прежний предел. */
LOAD_FAULT : LOAD_RELOAD);
/* Исключает отправку рабочего задания в такте защитной остановки. */
active = 0; sinus = 0;
/* Закрывает выбор между ожиданием и защитным сбросом. */
}
/* Завершает проверку следующего токового задания при низком ЗПТ. */
}
/* Завершает обработку активной рампы при свежем выбранном напряжении CAN. */
}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
} else {
@@ -479,12 +498,6 @@ void Load_runner(void)
/* Во время защиты и пуска ручной код калибровки запрещён.
* Калибровка сохранена только при снятом START и свободном STOP.
* Нулевой код задания здесь означает ток 4 мА по DAC_min(). */
/* Записывает ump_dac_ramp значением load_count_ramp; ump ЦАП ramp. */
ump_dac_ramp = load_count_ramp;
/* Записывает ump_dac_duration значением time_dac; ump ЦАП duration. */
ump_dac_duration = time_dac;
/* Записывает ump_dac_position значением (unsigned int)sinus; ump ЦАП position. */
ump_dac_position = (unsigned int)sinus;
/* Проверяет if (active и !fresh); последующий оператор выполняется только при истинном условии. */
if (active && !fresh) {
/* Удерживаем ЦАП. Даже cInitDac не меняет ток в паузе CAN. */
@@ -498,6 +511,8 @@ void Load_runner(void)
anal_output((int)sinus, time_dac,
/* Продолжает список аргументов, полей или выражение !start && !load_stop_asserted);; порядок элементов сохраняется. */
!start && !load_stop_asserted);
/* Уменьшает остаток только после отправки 6 мА: тайм-аут CAN, инициализация ЦАП и STOP не расходуют выдержку. */
if (voltage_wait) load_start_remaining--;
/* A manual calibration frame is not a confirmed 4 mA reload.
* START must wait for a forced baseline frame after it. */
/* Проверяет if (!active) load_zero_sent = !(!start и !load_stop_asserted и cCalibrDac); последующий оператор выполняется только при истинном условии. */
@@ -522,8 +537,6 @@ void Load_runner(void)
(load_state == LOAD_RUN ? 8U : 0U) |
/* Продолжает список аргументов, полей или выражение (load_simulation << 4);; порядок элементов сохраняется. */
(load_simulation << 4);
/* Записывает LOAD_ATTEMPTS значением load_attempts; число попыток пуска для чтения, регистр 0x7D. */
LOAD_ATTEMPTS = load_attempts;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}

View File

@@ -59,16 +59,14 @@ void clear_mem();
#define UMP_LOG_BASE 0x1000U
/* Задаёт UMP_LOG_DATA = 0x1010U; UMP LOG данные. */
#define UMP_LOG_DATA 0x1010U
/* Задаёт UMP_LOG_WORDS = 42U; UMP LOG слова. */
#define UMP_LOG_WORDS 42U
/* Запись v4 содержит 12 слов: время, событие, дискреты, ток, уставки, два ЗПТ и нулевой резерв для пар CAN. */
#define UMP_LOG_WORDS 12U
/* Задаёт UMP_LOG_CAPACITY = 760U; данные UMP_LOG_CAPACITY. */
#define UMP_LOG_CAPACITY 760U
/* Задаёт UMP_LOG_LIVE_RECORDS = (120U / UMP_LOG_WORDS); данные UMP_LOG_LIVE_RECORDS. */
#define UMP_LOG_LIVE_RECORDS (120U / UMP_LOG_WORDS)
/* Задаёт UMP_LOG_LIVE = 0x1100U; данные UMP_LOG_LIVE. */
#define UMP_LOG_LIVE 0x1100U
/* Объявляет ump_dac_ramp — ump ЦАП ramp; ump_dac_duration — ump ЦАП duration; ump_dac_go10 — ump ЦАП go 10; ump_dac_stop10 — ump ЦАП stop 10; ump_dac_position — ump ЦАП position. Память определена в другом модуле. */
extern unsigned int ump_dac_ramp, ump_dac_duration, ump_dac_go10, ump_dac_stop10, ump_dac_position;
/* Явно инициализирует оба банка регистратора до включения IRQ; повторный старт записи архив не стирает. */
void ump_log_init(void);
/* Продвигает время регистратора в Timer1 и снимает записи с заданным периодом. */

View File

@@ -68,7 +68,7 @@ void ReceiveAnswerModbus4(RS_DATA *rs_arr);
void Save_params(void);
/* Читает сохранённые регистры из области параметров EEPROM и применяет настройки платы. */
void Load_params(void);
/* Заполняет регистры заводскими значениями; тайм-аут CAN нагрузки по умолчанию равен 600 мс. */
/* Объявляет восстановление заводских параметров; для LOAD функция задаёт тайм-аут свежести CAN 2000 мс. */
void Default_params(void);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */

View File

@@ -171,13 +171,15 @@
/* Задаёт DAC_stop = modbus[0x51]; конечный ток нагрузки в мА, технологический регистр 0x51. */
#define DAC_stop modbus[0x51] // конец зарада
/* LOAD-only persistent CAN timeout (ms), read-only status and attempts. */
/* На плате LOAD тайм-аут и лимит попыток сохраняются штатной командой Save; состояние защиты доступно только для чтения. */
/* Задаёт LOAD_CAN_TIMEOUT = modbus[0x52]; сохраняемый тайм-аут свежести напряжения CAN в миллисекундах, регистр 0x52. */
#define LOAD_CAN_TIMEOUT modbus[0x52]
/* Задаёт LOAD_STATUS = modbus[0x7C]; слово состояния защиты нагрузки для чтения, регистр 0x7C. */
#define LOAD_STATUS modbus[0x7C]
/* Задаёт LOAD_ATTEMPTS = modbus[0x7D]; число попыток пуска для чтения, регистр 0x7D. */
#define LOAD_ATTEMPTS modbus[0x7D]
/* Задаёт записываемый лимит общего числа пусков в регистре 0x7D; допустимы 1..65535 попыток, включая первый START. */
#define LOAD_MAX_ATTEMPTS modbus[0x7D]
/* Сохраняет прежний заводской предел пяти пусков для сброса настроек и замены нуля из старой EEPROM. */
#define LOAD_DEFAULT_MAX_ATTEMPTS 5U
/* Задаёт Cancount = (modbus+0x60); данные Cancount. */
#define Cancount (modbus+0x60) // пауза между I посылками CAN

View File

@@ -93,9 +93,9 @@ typedef unsigned int SE2P_SIZE;
/* Message declaration */
/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */
typedef struct {
unsigned int *dataPtr; /* Data pointer */ /* Объявляет dataPtr — данные Ptr. Хранит указатель на данные. */
unsigned long nrData; /* number of data */ /* Объявляет nrData — nr данные. */
unsigned long se2pAddr; /* se2pAddr */ /* Объявляет se2pAddr — данные se2pAddr. */
unsigned int * volatile dataPtr; /* Указатель буфера публикуется до csr: volatile запрещает перенос его записи за ожидание Timer2. */
volatile unsigned long nrData; /* Число 16-битных слов записывается до флага запуска; Timer2 использует его для завершения передачи. */
volatile unsigned long se2pAddr; /* Байтовый адрес EEPROM публикуется до csr; прерывание должно получить адрес текущего задания. */
/* Продолжает список аргументов, полей или выражение }SE2P_DATA;; порядок элементов сохраняется. */
}SE2P_DATA;
@@ -103,8 +103,8 @@ typedef struct {
/* Object declaration */
/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */
typedef struct {
/* Main loop publishes the descriptor before setting csr; Timer2 consumes it.
* Both accesses are volatile so optimization cannot publish the request first. */
/* Главный цикл заполняет volatile-поля задания, затем msgPtr и csr; Timer2 читает их после запроса.
* Одного volatile у msgPtr недостаточно: он защищает указатель, но не содержимое задания. */
/* Продолжает список аргументов, полей или выражение SE2P_DATA * volatile msgPtr;; порядок элементов сохраняется. */
SE2P_DATA * volatile msgPtr;
volatile unsigned int csr; /* control/status register */ /* Объявляет csr — данные csr. volatile требует фактического чтения или записи при каждом доступе. */

View File

@@ -9,6 +9,7 @@
/* Подключает "RS485.h": приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
#include "RS485.h"
#include <string.h> /* Объявляет memset для явного сброса UART: загрузчик COFF не гарантирует очистку .ebss. */
/* Подключает "bios_dsp.h": коды и объявления команд последовательного загрузчика. */
#include "bios_dsp.h"
/* Подключает "cntrl_adr.h": собственный и универсальный адрес устройства. */
@@ -730,6 +731,7 @@ void RS_SetLineSpeed(RS_DATA *rs_arr,unsigned long speed)
rs_arr->SciRegs->SCIHBAUD = HIBYTE((int)SciBaud);
/* Записывает rs_arr->SciRegs->SCILBAUD значением LOBYTE((int)SciBaud); rs arr SCI Regs SCILBAUD. */
rs_arr->SciRegs->SCILBAUD = LOBYTE((int)SciBaud);
rs_arr->curr_baud = speed; /* Сохраняет установленную скорость в бодах для последующих команд переключения линии и диагностики CCS. */
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
@@ -741,6 +743,8 @@ void create_uart_vars(char size_cmd15_set)
{
/* Записывает size_cmd15 значением size_cmd15_set; размер cmd 15. */
size_cmd15=size_cmd15_set;
memset(&rs_a, 0, sizeof(rs_a)); /* Сбрасывает указатели, длины, буферы и флаги SCI-A до настройки порта; исключает остатки RAM после JTAG. */
memset(&rs_b, 0, sizeof(rs_b)); /* Независимо сбрасывает состояние SCI-B до назначения номера и аппаратных регистров. */
/* Записывает rs_a.commnumber значением COM_1; данные commnumber. */
rs_a.commnumber=COM_1;
/* Записывает rs_b.commnumber значением COM_2; данные commnumber. */

View File

@@ -335,10 +335,8 @@ void CAN_send(int Port, int data[], int Addr)
void Handlai(volatile struct ECAN_MBOXES * ECanMboxes)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет adr — данные adr. */
unsigned int adr;
/* Объявляет bit — представление регистра отдельными битовыми полями. */
unsigned int bit[3];
/* adr адресует очередное технологическое слово, slot выбирает одно из трёх слов кадра, mask хранит их биты достоверности 15..13. */
unsigned int adr, slot, mask;
/* Объявляет hiword — данные hiword; loword — данные loword. */
unsigned long hiword,loword;
/* Объявляет Data — данные. */
@@ -376,12 +374,8 @@ void Handlai(volatile struct ECAN_MBOXES * ECanMboxes)
/* Записывает adr значением (hiword >> 16); данные adr. */
adr = (hiword >> 16);
/* Записывает bit[0] значением adr & 0x8000; представление регистра отдельными битовыми полями. */
bit[0] = adr & 0x8000;
/* Записывает bit[1] значением adr & 0x4000; представление регистра отдельными битовыми полями. */
bit[1] = adr & 0x4000;
/* Записывает bit[2] значением adr & 0x2000; представление регистра отдельными битовыми полями. */
bit[2] = adr & 0x2000;
/* Маска 0xE000 объединяет биты достоверности трёх слов CAN; сдвиг в цикле последовательно выводит каждый из них в бит 15. */
mask = adr & 0xE000U;
/* Оставляет биты маски adr значением 0x1fff; данные adr. */
adr &= 0x1fff;
@@ -393,18 +387,12 @@ void Handlai(volatile struct ECAN_MBOXES * ECanMboxes)
/* Записывает Data[2] значением (loword ) & 0xffff; данные. */
Data[2] = (loword ) & 0xffff;
/* Проверяет if(bit[0]) if(adr < ANSWER_LEN и; последующий оператор выполняется только при истинном условии. */
if(bit[0]) if(adr < ANSWER_LEN &&
/* Записывает modbus[adr] значением Data[0]; adr++; массив технологических регистров; слово int на C28x занимает 16 бит. */
!(Desk == dsk_LOAD && (adr == 0x7CU || adr == 0x7DU))) modbus[adr] = Data[0]; adr++;
/* Проверяет if(bit[1]) if(adr < ANSWER_LEN и; последующий оператор выполняется только при истинном условии. */
if(bit[1]) if(adr < ANSWER_LEN &&
/* Записывает modbus[adr] значением Data[1]; adr++; массив технологических регистров; слово int на C28x занимает 16 бит. */
!(Desk == dsk_LOAD && (adr == 0x7CU || adr == 0x7DU))) modbus[adr] = Data[1]; adr++;
/* Проверяет if(bit[2]) if(adr < ANSWER_LEN и; последующий оператор выполняется только при истинном условии. */
if(bit[2]) if(adr < ANSWER_LEN &&
/* Записывает modbus[adr] значением Data[2]; массив технологических регистров; слово int на C28x занимает 16 бит. */
!(Desk == dsk_LOAD && (adr == 0x7CU || adr == 0x7DU))) modbus[adr] = Data[2];
/* Обрабатывает ровно три слова CAN; адрес растёт независимо от маски, а её сдвиг выбирает достоверность следующего слова. */
for (slot = 0; slot < 3; slot++, adr++, mask <<= 1)
/* Бит 15 текущей маски разрешает запись только в опубликованные 128 регистров, исключая выход за массив. */
if ((mask & 0x8000U) && adr < ANSWER_LEN &&
/* Для LOAD сохраняет статус 0x7C и отклоняет ноль в лимите 0x7D; остальные значения сохраняются как исходное 16-битное слово. */
!(Desk == dsk_LOAD && (adr == 0x7CU || (adr == 0x7DU && !(unsigned int)Data[slot])))) modbus[adr] = Data[slot];
/* Фиксируем применённую команду до выхода из обработчика CAN. */
/* A short frame cannot confirm voltage freshness. Service frames

View File

@@ -17,7 +17,7 @@ extern void ump_log_rs(void);
static const uint16_t gas167_info[GAS167_INFO_WORDS] = {
/* Слова 0..3: сигнатура GA/S1, версия профиля и номер проекта 167. */
0x4741U, 0x5331U, GAS167_PROFILE_VERSION, 167U,
/* Слова 4..7: начало 0x5000, длина 128 слов, возможности RTU/CAN/FC06 и размер адресной единицы в словах. */
/* Слова 4..7: база технологических регистров, число слов, маска RTU/CAN/FC06 и признак EEPROM M95M02 = 1; последний элемент описывает аппаратный профиль. */
GAS167_REG_BASE, GAS167_REG_COUNT, GAS167_CAPABILITIES, 1U
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
};
@@ -39,8 +39,10 @@ static unsigned gas167_write(uint16_t offset, uint16_t value)
{
/* Правила записи совпадают со штатным Modbus: статусы защиты нельзя
* перезаписать, а недопустимый тайм-аут не позволяет обойти защиту. */
/* На плате LOAD состояния 0x7C/0x7D принадлежат защите; запись отклоняется кодом неверного адреса 2. */
if (Desk == dsk_LOAD && (offset == 0x7CU || offset == 0x7DU)) return 2;
/* Состояние защиты 0x7C остаётся только для чтения; GAS-псевдоним лимита 0x507D допускает запись. */
if (Desk == dsk_LOAD && offset == 0x7CU) return 2;
/* Отклоняет нулевой лимит кодом Modbus 3 одинаково для RTU и служебного CAN; uint16_t ограничивает верхнюю границу 65535. */
if (Desk == dsk_LOAD && offset == 0x7DU && value == 0U) return 3;
/* Для сохраняемого тайм-аута CAN нагрузки применяется проверка диапазона независимо от транспорта. */
if (Desk == dsk_LOAD && offset == 0x52U &&
/* Значение 0 или больше 60000 мс недопустимо и возвращает код 3; защиту нельзя отключить такой записью. */

View File

@@ -75,19 +75,11 @@ static unsigned int ump_source, ump_post;
#define UMP_POST_POINTS (UMP_LOG_CAPACITY / 10U)
/* Замораживает заполненный банк и переключает рабочий банк, сохраняя доступный архив. */
static void ump_freeze(void);
/* Объявляет ump_can_header — ump CAN header; ump_can_data — ump CAN данные; ump_can_count — ump CAN число. */
static unsigned int ump_can_header, ump_can_data[3], ump_can_count;
/* Latest PM67 sums: register 306 (index 305), register 9 (index 8). */
/* Объявляет ump_pm67_voltage — данные ump_pm67_voltage. */
static unsigned int ump_pm67_voltage[2];
/* Объявляет ump_prev_commands — данные ump_prev_commands; ump_prev_inputs — данные ump_prev_inputs; ump_prev_outputs — данные ump_prev_outputs. */
static unsigned int ump_prev_commands, ump_prev_inputs, ump_prev_outputs;
/* Объявляет CanTimeOutErrorTR — CAN Time Out ошибка TR. Память определена в другом модуле. */
extern int CanTimeOutErrorTR;
/* Диагностика внутренних переменных разгона. Обновляется самим Load_runner,
* не пересчитывает и не изменяет управляющий алгоритм. */
/* Объявляет ump_dac_ramp — ump ЦАП ramp; ump_dac_duration — ump ЦАП duration; ump_dac_go10 — ump ЦАП go 10; ump_dac_stop10 — ump ЦАП stop 10; ump_dac_position — ump ЦАП position. */
unsigned int ump_dac_ramp, ump_dac_duration, ump_dac_go10, ump_dac_stop10, ump_dac_position;
/* Called once at boot, before enabling interrupts. TI COFF startup does
* not clear uninitialized globals in .ebss. Do not use for record restart:
@@ -110,18 +102,10 @@ void ump_log_init(void)
ump_archive_count = 0; ump_archive_next = 0; ump_generation = 0;
/* Записывает ump_source значением 0; ump_post = 0; данные ump_source. */
ump_source = 0; ump_post = 0;
/* Записывает ump_can_header значением 0; ump_can_count = 0; ump CAN header. */
ump_can_header = 0; ump_can_count = 0;
/* Цикл for (i = 0; i < 3; i++) ump_can_data[i] = 0;; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 0; i < 3; i++) ump_can_data[i] = 0;
/* Цикл for (i = 0; i < 2; i++) ump_pm67_voltage[i] = 0;; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 0; i < 2; i++) ump_pm67_voltage[i] = 0;
/* Записывает ump_prev_commands значением 0; ump_prev_inputs = 0; ump_prev_outputs = 0; данные ump_prev_commands. */
ump_prev_commands = 0; ump_prev_inputs = 0; ump_prev_outputs = 0;
/* Записывает ump_dac_ramp значением 0; ump_dac_duration = 0; ump_dac_go10 = 0; ump ЦАП ramp. */
ump_dac_ramp = 0; ump_dac_duration = 0; ump_dac_go10 = 0;
/* Записывает ump_dac_stop10 значением 0; ump_dac_position = 0; ump ЦАП stop 10. */
ump_dac_stop10 = 0; ump_dac_position = 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
@@ -164,8 +148,8 @@ static void ump_capture(unsigned int reason)
{
/* Объявляет p — данные p. Хранит указатель на данные. volatile требует фактического чтения или записи при каждом доступе. */
volatile unsigned int *p;
/* Объявляет i — данные i; commands — данные commands; inputs — данные inputs; outputs — данные outputs. */
unsigned int i, commands, inputs, outputs;
/* Объявляет commands — данные commands; inputs — данные inputs; outputs — данные outputs. */
unsigned int commands, inputs, outputs;
/* Проверяет if (ump_state != 1 или Desk != dsk_LOAD или !READY) return; последующий оператор выполняется только при истинном условии. */
if (ump_state != 1 || Desk != dsk_LOAD || !READY) return;
/* Проверяет if (no_write или never_write); последующий оператор выполняется только при истинном условии. */
@@ -200,40 +184,20 @@ static void ump_capture(unsigned int reason)
if (ump_post && !(reason & 0x100) && --ump_post == 0) reason = 5;
/* Записывает p значением logs_block + ((unsigned long)ump_bank * UMP_LOG_CAPACITY + ump_next) * UMP_LOG_WORDS; данные p. */
p = logs_block + ((unsigned long)ump_bank * UMP_LOG_CAPACITY + ump_next) * UMP_LOG_WORDS;
/* Записывает p[0] значением (unsigned int)ump_time; p[1] = (unsigned int)(ump_time >> 16); данные p. */
/* Сохраняет 32-битное миллисекундное время младшим словом вперёд; это первые два слова записи v4. */
p[0] = (unsigned int)ump_time; p[1] = (unsigned int)(ump_time >> 16);
/* Записывает p[2] значением reason; p[3] = commands; данные p. */
p[2] = reason; p[3] = commands;
/* Записывает p[4] значением inputs; p[5] = outputs; данные p. */
/* Событие сохраняет причину и метку отключения; от команд остаются только нужные дискретные пуск и сброс, биты 7/6. */
p[2] = reason; p[3] = commands & 0xC0U;
/* Оставляет логические уровни входов и выходов для графиков START, STOP, OMEGA и разрешения нагрузки. */
p[4] = inputs; p[5] = outputs;
/* Записывает p[6] значением (unsigned int)IMPowse; p[7] = (unsigned int)WAKEpowse; данные p. */
p[6] = (unsigned int)IMPowse; p[7] = (unsigned int)WAKEpowse;
/* Записывает p[8] значением modbus[0x7B]; p[9] = modbus[0x1C]; данные p. */
p[8] = modbus[0x7B]; p[9] = modbus[0x1C];
/* Цикл for (i = 0; i < 4; i++) ; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 0; i < 4; i++) { p[10+i] = sens_data[i]; p[14+i] = modbus[i]; }
/* Записывает p[18] значением ump_can_header; данные p. */
p[18] = ump_can_header;
/* Записывает p[19] значением ump_can_data[0]; p[20] = ump_can_data[1]; p[21] = ump_can_data[2]; данные p. */
p[19] = ump_can_data[0]; p[20] = ump_can_data[1]; p[21] = ump_can_data[2];
/* Записывает p[22] значением ump_can_count; p[23] = CanTimeOutErrorTR; данные p. */
p[22] = ump_can_count; p[23] = CanTimeOutErrorTR;
/* Исходные уставки — мА; эффективные уставки после ограничений — 0.1 мА.
* p[8] — отправленный код, а p[9] — расчётное задание, НЕ измерение тока. */
/* Записывает p[24] значением DAC_go; p[25] = DAC_stop; данные p. */
p[24] = DAC_go; p[25] = DAC_stop;
/* Записывает p[26] значением DAC_min(); p[27] = DAC_max(); p[28] = DAC_cal(); данные p. */
p[26] = DAC_min(); p[27] = DAC_max(); p[28] = DAC_cal();
/* Записывает p[29] значением DAC_04; p[30] = DAC_20; данные p. */
p[29] = DAC_04; p[30] = DAC_20;
/* Записывает p[31] значением ump_dac_ramp; p[32] = ump_dac_duration; данные p. */
p[31] = ump_dac_ramp; p[32] = ump_dac_duration;
/* Записывает p[33] значением ump_dac_go10; p[34] = ump_dac_stop10; p[35] = ump_dac_position; данные p. */
p[33] = ump_dac_go10; p[34] = ump_dac_stop10; p[35] = ump_dac_position;
/* Цикл for (i = 0; i < 4; i++) p[36+i] = ADC_table[i];; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 0; i < 4; i++) p[36+i] = ADC_table[i];
/* Записывает p[40] значением ump_pm67_voltage[0]; p[41] = ump_pm67_voltage[1]; данные p. */
p[40] = ump_pm67_voltage[0]; p[41] = ump_pm67_voltage[1];
/* Задание тока берётся из регистра 0x1C в единицах 0,1 мА; это расчётная величина, а не измерение физического тока. */
p[6] = modbus[0x1C];
/* Сохраняет оставшиеся выбранные начальную и конечную уставки в целых мА. */
p[7] = DAC_go; p[8] = DAC_stop;
/* Оставляет оба ЗПТ в вольтах: CAN-индекс 305 относится к ЗПТ1, индекс 8 — к ЗПТ2. */
p[9] = ump_pm67_voltage[0]; p[10] = ump_pm67_voltage[1];
/* Резервное нулевое слово делает длину записи чётной: служебный CAN передаёт по два 16-битных слова за фрагмент. */
p[11] = 0;
/* Изменяет счётчик в выражении ump_next++; на один для следующего шага. */
ump_next++;
/* Проверяет if (ump_next == UMP_LOG_CAPACITY) ump_next = 0; последующий оператор выполняется только при истинном условии. */
@@ -338,12 +302,6 @@ void ump_log_can(unsigned int header, unsigned int a, unsigned int b, unsigned i
}
/* Проверяет if (ump_state != 1); последующий оператор выполняется только при истинном условии. */
if (ump_state != 1) { __restore_interrupts(saved); return; }
/* Записывает ump_can_header значением header; ump CAN header. */
ump_can_header = header;
/* Записывает ump_can_data[0] значением a; ump_can_data[1] = b; ump_can_data[2] = c; ump CAN данные. */
ump_can_data[0] = a; ump_can_data[1] = b; ump_can_data[2] = c;
/* Изменяет счётчик в выражении ump_can_count++; на один для следующего шага. */
ump_can_count++;
/* Вызывает ump_capture. Создаёт одну запись состояния: входы, выходы, команды, напряжения и параметры тока нагрузки. */
ump_capture(2);
/* Вызывает __restore_interrupts с аргументами (saved) в текущей последовательности операций. */
@@ -456,7 +414,7 @@ unsigned int ump_log_read(unsigned int address)
/* Ветвь выбора для UMP_LOG_BASE; выполняется при совпадении селектора switch. */
case UMP_LOG_BASE: return 0x554D;
/* Ветвь выбора для UMP_LOG_BASE+1; выполняется при совпадении селектора switch. */
case UMP_LOG_BASE+1: return 3;
case UMP_LOG_BASE+1: return 4;
/* Ветвь выбора для UMP_LOG_BASE+2; выполняется при совпадении селектора switch. */
case UMP_LOG_BASE+2: return ump_source ? 3 : ump_state;
/* Ветвь выбора для UMP_LOG_BASE+3; выполняется при совпадении селектора switch. */
@@ -501,7 +459,7 @@ unsigned int ump_log_read(unsigned int address)
return ump_word(ump_source, ump_cursor + offset / UMP_LOG_WORDS, offset % UMP_LOG_WORDS);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Последние три записи для онлайн-графика, без остановки и без
/* Последние UMP_LOG_LIVE_RECORDS записей для онлайн-графика, без остановки и без
* изменения курсора архивного чтения. Первые два слова — их номер. */
/* Проверяет if (address >= UMP_LOG_LIVE и address < UMP_LOG_LIVE+124); последующий оператор выполняется только при истинном условии. */
if (address >= UMP_LOG_LIVE && address < UMP_LOG_LIVE+124) {

View File

@@ -109,7 +109,7 @@ void main()
setup_uart(COM_1,115200);
/* Проверяет if(Owen)setup_uart(COM_2,57600); последующий оператор выполняется только при истинном условии. */
if(Owen)setup_uart(COM_2,57600);
if(Owen)setup_uart(COM_2,115200);
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else setup_uart(COM_2,115200);
@@ -266,7 +266,7 @@ void main()
{
/* Записывает cDefParam значением 0; данные cDefParam. */
cDefParam=0;
/* Вызывает Default_params. Заполняет регистры заводскими значениями; тайм-аут CAN нагрузки по умолчанию равен 600 мс. */
/* По команде восстановления записывает заводские параметры; для LOAD тайм-аут свежести CAN становится 2000 мс. */
Default_params();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}

View File

@@ -746,7 +746,7 @@ void Init_packMask()
{ Maska[m_SLOW][7]|= 0x0030; // Калибровка ЦАП
/* Устанавливает биты Maska[m_SLOW][5] значением 0x0003; данные Maska. */
Maska[m_SLOW][5]|= 0x0003; // Начало и конец зарада
Maska[m_FAST][7]|= 0xF000; /* Protection status 0x7C + attempts 0x7D. */ // Дублировать команды /* Устанавливает биты Maska[m_FAST][7] значением 0xF000; данные Maska. */
Maska[m_FAST][7]|= 0xF000; /* Быстрый CAN публикует статус 0x7C и настроенный лимит пусков 0x7D; биты 12..15 маски соответствуют адресам 0x7C..0x7F. */ // Дублировать команды /* Устанавливает биты Maska[m_FAST][7] значением 0xF000; данные Maska. */
/* Устанавливает биты Maska[m_FAST][1] значением 0x3000; данные Maska. */
Maska[m_FAST][1]|= 0x3000; // Управлающий ток СИФУ
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */

View File

@@ -59,7 +59,7 @@ int modbus[ANSWER_LEN+1];
/* Объявляет param — данные param. */
unsigned int param[ANSWER_LEN+1];
/* Заполняет регистры заводскими значениями; тайм-аут CAN нагрузки по умолчанию равен 600 мс. */
/* Заполняет регистры заводскими значениями; для LOAD задаёт тайм-аут свежести CAN 2000 мс. Значение 600 мс применяется отдельно при восстановлении недопустимого параметра. */
void Default_params()
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
@@ -248,6 +248,8 @@ void Default_params()
/* Записывает DAC_go значением 6; начальный ток нагрузки в мА, технологический регистр 0x50. */
DAC_go = 6; // начало зарада
LOAD_CAN_TIMEOUT = 2000; /* ms without fresh ZPT: freeze ramp. */ /* Записывает LOAD_CAN_TIMEOUT значением 2000; сохраняемый тайм-аут свежести напряжения CAN в миллисекундах, регистр 0x52. */
/* Устанавливает прежний заводской лимит пяти пусков, включая первый START; настройка хранится в сохраняемом регистре 0x7D. */
LOAD_MAX_ATTEMPTS = LOAD_DEFAULT_MAX_ATTEMPTS;
/* Записывает DAC_stop значением 16; конечный ток нагрузки в мА, технологический регистр 0x51. */
DAC_stop= 16; // конец зарада
@@ -295,7 +297,7 @@ void Load_params()
else
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Вызывает Default_params. Заполняет регистры заводскими значениями; тайм-аут CAN нагрузки по умолчанию равен 600 мс. */
/* Восстанавливает заводские параметры после неверного CRC или несоответствия режима платы; LOAD_CAN_TIMEOUT получает 2000 мс. */
Default_params();
/* Записывает Commands значением 0; слово команд, технологический регистр 127. */
Commands=0;
@@ -373,7 +375,7 @@ static void modbus_exception(RS_DATA *rs_arr, unsigned int function, unsigned in
}
/* UART parser has already validated CRC and accepted the device address. */
/* Выбирает GAS либо существующее адресное пространство УМП и снимает согласованный ответ под краткой блокировкой IRQ. */
/* Маршрутизирует расширенные адреса: RAM УМП/GAS захватывается под краткой блокировкой IRQ, а чтение EEPROM выполняется с разрешёнными IRQ, поскольку SPI продвигается из Timer2. */
static int receive_ump(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
@@ -381,7 +383,7 @@ static int receive_ump(RS_DATA *rs_arr)
unsigned int address, value, saved, length, count, error;
/* Main-loop only; encoded into the UART buffer before the next request.
* Keep the 124-word snapshot off the shared interrupt stack. */
/* Объявляет words — слова. */
/* Статический буфер хранит до 124 слов снимка вне общего стека прерываний; главный цикл сериализует его до обработки следующего запроса. */
static uint16_t words[UMP_MAX_WORDS];
/* Записывает address значением (rs_arr->RS_Header[2] << 8) | rs_arr->RS_Header[3]; адрес. */
address = (rs_arr->RS_Header[2] << 8) | rs_arr->RS_Header[3];
@@ -503,17 +505,18 @@ void ReceiveCommandModbus3(RS_DATA *rs_arr)
/* Записывает rs_arr->buffer[2] значением Length_MB*2; rs arr буфер. */
rs_arr->buffer[2] = Length_MB*2;
/* Защищаем целостность одного снимка/блока; передача UART идёт уже
* с разрешёнными прерываниями и не задерживает измерение/управление. */
/* Цикл for (i=0;i<Length_MB;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
/* Штатные регистры копируются последовательно без блокировки IRQ вокруг всего блока.
* Измерительные ISR могут обновить соседние слова между чтениями; этот путь не гарантирует
* единый момент захвата всех значений. RAM-расширения захватываются отдельно в receive_ump. */
/* Формирует payload из запрошенного числа 16-битных слов; для каждого слова в ответе нужны два байта. */
for (i=0;i<Length_MB;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает value значением modbus[Address_MB+i]; данные value. */
/* Читает очередное слово один раз, чтобы старший и младший байты ответа относились к одному считанному значению. */
value = modbus[Address_MB+i];
/* Записывает rs_arr->buffer[3+i*2] значением (value >> 8) & 0xFF; rs arr буфер. */
/* Помещает старший байт слова после трёхбайтного заголовка; данные регистра передаются старшим байтом вперёд. */
rs_arr->buffer[3+i*2] = (value >> 8) & 0xFF;
/* Записывает rs_arr->buffer[3+i*2+1] значением value & 0xFF; rs arr буфер. */
/* Помещает младший байт непосредственно за старшим, сохраняя исходный 16-битный рисунок регистра. */
rs_arr->buffer[3+i*2+1] = value & 0xFF;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
@@ -528,13 +531,13 @@ void ReceiveCommandModbus3(RS_DATA *rs_arr)
/* Записывает rs_arr->buffer[Length_MB*2+4] значением HIBYTE(crc); rs arr буфер. */
rs_arr->buffer[Length_MB*2+4] = HIBYTE(crc);
/* Записывает rs_arr->buffer[Length_MB*2+5] значением 0; rs arr буфер. */
/* Первый исторический нулевой байт после CRC; входит в увеличенную длину штатного ответа. */
rs_arr->buffer[Length_MB*2+5] = 0;
/* Записывает rs_arr->buffer[Length_MB*2+6] значением 0; rs arr буфер. */
/* Второй исторический нулевой байт после CRC; сохраняет прежний формат низких технологических адресов. */
rs_arr->buffer[Length_MB*2+6] = 0;
/* Записывает rs_arr->buffer[Length_MB*2+7] значением 0; rs arr буфер. */
/* Третий исторический нулевой байт после CRC; это последний элемент передаваемого буфера при длине 2*N+8. */
rs_arr->buffer[Length_MB*2+7] = 0;
/* Записывает rs_arr->buffer[Length_MB*2+8] значением 0; rs arr буфер. */
/* Дополнительный ноль находится за длиной, переданной в RS_Send; в текущий ответ это слово не отправляется. */
rs_arr->buffer[Length_MB*2+8] = 0;
/* Записывает rs_arr->flag_TIMEOUT_to_Send значением true; rs arr флаг TIMEOUT to Send. */
@@ -577,12 +580,18 @@ void ReceiveCommandModbus6(RS_DATA *rs_arr)
/* Записывает Data_MB значением (rs_arr->RS_Header[4] << 8) | rs_arr->RS_Header[5]; данные MB. */
Data_MB = (rs_arr->RS_Header[4] << 8) | rs_arr->RS_Header[5];
/* Проверяет if (Desk == dsk_LOAD и (Address_MB == 0x7CU или Address_MB == 0x7DU)); последующий оператор выполняется только при истинном условии. */
if (Desk == dsk_LOAD && (Address_MB == 0x7CU || Address_MB == 0x7DU)) {
/* На плате LOAD запрещает запись только состояния защиты 0x7C; регистр лимита 0x7D принимает настройку. */
if (Desk == dsk_LOAD && Address_MB == 0x7CU) {
/* Вызывает modbus_exception. Формирует ответ Modbus с установленным старшим битом функции и кодом исключения. */
modbus_exception(rs_arr, CMD_MODBUS_6, 2); return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Ноль в лимите 0x7D недопустим: первый пуск должен входить в разрешённые 1..65535 попыток. */
if (Desk == dsk_LOAD && Address_MB == 0x7DU && Data_MB == 0U) {
/* Возвращает код Modbus 3 для недопустимого значения, сохраняя прежний лимит и состояние автомата. */
modbus_exception(rs_arr, CMD_MODBUS_6, 3); return;
/* Завершает проверку ненулевого лимита перед общей записью технологического слова. */
}
/* Проверяет if (Desk == dsk_LOAD и Address_MB == 0x52U и; последующий оператор выполняется только при истинном условии. */
if (Desk == dsk_LOAD && Address_MB == 0x52U &&
/* Продолжает список аргументов, полей или выражение (Data_MB == 0U || Data_MB > 60000U)) {; порядок элементов сохраняется. */

View File

@@ -1,10 +1,10 @@
******************************************************************************
TMS320C2000 Linker PC v22.6.0
******************************************************************************
>> Linked Thu Oct 1 18:01:50 2026
>> Linked Mon Oct 12 12:22:39 2026
OUTPUT FILE NAME: <K:/git_project/Balsam_167_periph/UKSSTMS320F28335/../bin/UKSSTMS320F28335.out>
ENTRY POINT SYMBOL: "_c_int00" address: 0000b9b5
ENTRY POINT SYMBOL: "_c_int00" address: 0000a855
MEMORY CONFIGURATION
@@ -13,8 +13,8 @@ MEMORY CONFIGURATION
---------------------- -------- --------- -------- -------- ---- --------
PAGE 0:
ZONE0 00004000 00001000 00000000 00001000 RWIX
RAML0 00008000 00004000 00003b73 0000048d RWIX
RAML4 0000c000 00001000 000003f8 00000c08 RWIX
RAML0 00008000 00004000 00003aa7 00000559 RWIX
RAML4 0000c000 00001000 000003e6 00000c1a RWIX
ZONE6 00100000 00100000 00000000 00100000 RWIX
FLASHH 00300000 00008000 00000000 00008000 RWIX
FLASHG 00308000 00008000 00000000 00008000 RWIX
@@ -87,7 +87,7 @@ PAGE 1:
SCIB 00007750 00000010 00000010 00000000 RWIX
SCIC 00007770 00000010 00000010 00000000 RWIX
I2CA 00007900 00000040 00000022 0000001e RWIX
RAML5 0000d000 00003000 00000fdf 00002021 RWIX
RAML5 0000d000 00003000 0000105e 00001fa2 RWIX
ZONE7A 00200000 0000fc00 0000fa00 00000200 RWIX
ZONE7B 0020fc00 00000400 00000000 00000400 RWIX
FLASHB 00330000 00008000 00000000 00008000 RWIX
@@ -100,7 +100,7 @@ SECTION ALLOCATION MAP
output attributes/
section page origin length input sections
-------- ---- ---------- ---------- ----------------
.cinit 0 0000c000 0000028b
.cinit 0 0000c000 00000273
0000c000 00000103 crc16.obj (.cinit:_crc_16_tab)
0000c103 00000043 message.obj (.cinit:_def_cal)
0000c146 0000003d measure.obj (.cinit)
@@ -111,88 +111,269 @@ section page origin length input sections
0000c1f3 00000014 log_to_mem.obj (.cinit)
0000c207 00000013 kanal.obj (.cinit:_digits)
0000c21a 00000011 pulto.obj (.cinit)
0000c22b 00000010 DAC.obj (.cinit)
0000c23b 0000000a rts2800_fpu32.lib : _lock.obj (.cinit)
0000c245 0000000a : exit.obj (.cinit)
0000c24f 00000008 ADC.obj (.cinit)
0000c257 00000008 kanal.obj (.cinit:_readr)
0000c25f 00000008 cntrl_adr.obj (.cinit)
0000c267 00000008 main.obj (.cinit)
0000c26f 00000005 ADC.obj (.cinit:_cwnt_ok$4)
0000c274 00000005 measure.obj (.cinit:_low_count)
0000c279 00000004 RS485.obj (.cinit)
0000c27d 00000004 RS485.obj (.cinit:_RS_Len)
0000c281 00000004 bios.obj (.cinit)
0000c285 00000004 rts2800_fpu32.lib : errno.obj (.cinit)
0000c289 00000002 --HOLE-- [fill = 0]
0000c22b 0000000a rts2800_fpu32.lib : _lock.obj (.cinit)
0000c235 0000000a : exit.obj (.cinit)
0000c23f 00000008 ADC.obj (.cinit)
0000c247 00000008 kanal.obj (.cinit:_readr)
0000c24f 00000008 cntrl_adr.obj (.cinit)
0000c257 00000005 ADC.obj (.cinit:_cwnt_ok$4)
0000c25c 00000005 measure.obj (.cinit:_low_count)
0000c261 00000004 RS485.obj (.cinit)
0000c265 00000004 RS485.obj (.cinit:_RS_Len)
0000c269 00000004 bios.obj (.cinit)
0000c26d 00000004 rts2800_fpu32.lib : errno.obj (.cinit)
0000c271 00000002 --HOLE-- [fill = 0]
.pinit 0 00008000 00000000 UNINITIALIZED
.text 0 00008000 00003b73
00008000 000008e6 measure.obj (.text)
000088e6 00000711 DSP2833x_SWPrioritizedDefaultIsr.obj (.text:retain)
00008ff7 000003c3 peripher.obj (.text)
000093ba 000003bd RS485.obj (.text)
00009777 0000037f log_to_mem.obj (.text)
00009af6 00000325 message.obj (.text)
00009e1b 00000309 shared_ump.obj (.text)
0000a124 000002bf bios.obj (.text)
0000a3e3 0000025b spise2p.obj (.text)
0000a63e 0000024d main.obj (.text)
0000a88b 000001f9 ecan.obj (.text)
0000aa84 000001f3 ADC.obj (.text:retain)
0000ac77 000001c5 measure.obj (.text:retain)
0000ae3c 00000196 ADC.obj (.text)
0000afd2 0000018a DAC.obj (.text)
0000b15c 0000016c kanal.obj (.text)
0000b2c8 0000015d DSP2833x_SysCtrl.obj (.text)
0000b425 00000151 pulto.obj (.text:retain)
0000b576 00000114 RS485.obj (.text:retain)
0000b68a 0000010c DSP2833x_Xintf.obj (.text)
0000b796 00000088 rts2800_fpu32.lib : fs_div.obj (.text)
0000b81e 00000075 crc16.obj (.text)
0000b893 00000075 ecan.obj (.text:retain)
0000b908 0000005e DSP2833x_CpuTimers.obj (.text)
0000b966 0000004f tools.obj (.text)
0000b9b5 00000046 rts2800_fpu32.lib : boot.obj (.text)
0000b9fb 00000039 spise2p.obj (.text:retain)
0000ba34 00000037 filter_bat2.obj (.text)
0000ba6b 0000002a rts2800_fpu32.lib : l_div.obj (.text)
0000ba95 00000028 DSP2833x_PieCtrl.obj (.text)
0000babd 00000001 --HOLE-- [fill = 0]
0000babe 00000020 rts2800_fpu32.lib : sqrt.obj (.text)
0000bade 0000001d pulto.obj (.text)
0000bafb 0000001b rts2800_fpu32.lib : args_main.obj (.text)
0000bb16 00000019 DSP2833x_Adc.obj (.text)
0000bb2f 00000019 rts2800_fpu32.lib : exit.obj (.text)
0000bb48 0000000e DSP2833x_SWPrioritizedPieVect.obj (.text)
0000bb56 0000000b rts2800_fpu32.lib : u_div.obj (.text)
0000bb61 00000009 : _lock.obj (.text)
0000bb6a 00000005 cntrl_adr.obj (.text)
0000bb6f 00000004 DSP2833x_usDelay.obj (.text)
.text 0 00008000 00003aa7
00008000 0000025a measure.obj (.text:_Current_count)
0000825a 000001dd ADC.obj (.text:_adc_isr)
00008437 000001a7 measure.obj (.text:_Temper_count)
000085de 000001a3 peripher.obj (.text:_get_Buttons)
00008781 0000019f main.obj (.text:_main)
00008920 0000018d ADC.obj (.text:_setup_adc)
00008aad 00000184 measure.obj (.text:_cpu_timer1_isr_SENS)
00008c31 0000015c DAC.obj (.text:_Load_runner)
00008d8d 00000152 RS485.obj (.text:_RS_RX_Handler)
00008edf 00000143 pulto.obj (.text:_cpu_timer1_isr_PULT)
00009022 00000129 measure.obj (.text:_Init_sensors)
0000914b 00000122 spise2p.obj (.text:_SPISE2P_DRV_tick)
0000926d 00000115 peripher.obj (.text:_get_Mode)
00009382 0000010b kanal.obj (.text:_kanal_Send)
0000948d 000000f9 measure.obj (.text:_Power_count)
00009586 000000ec message.obj (.text:_Default_params)
00009672 000000ce RS485.obj (.text:_setup_uart)
00009740 000000b3 log_to_mem.obj (.text:_ump_log_read)
000097f3 000000ae measure.obj (.text:_calc_sensor_koef)
000098a1 000000ac ecan.obj (.text:_InitCan)
0000994d 000000a8 ecan.obj (.text:_UMP_CAN_service)
000099f5 00000001 bios.obj (.text:_init)
000099f6 0000009d message.obj (.text:_ReceiveCommandModbus3)
00009a93 0000009c peripher.obj (.text:_select_tpl_canal)
00009b2f 00000097 bios.obj (.text:_upload)
00009bc6 00000094 measure.obj (.text:_Init_packMask)
00009c5a 00000090 RS485.obj (.text:_RS_FifoTx)
00009cea 0000008c message.obj (.text:_receive_ump)
00009d76 0000008a log_to_mem.obj (.text:_ump_capture)
00009e00 00000088 rts2800_fpu32.lib : fs_div.obj (.text)
00009e88 00000085 DSP2833x_SysCtrl.obj (.text:_InitPeripheralClocks)
00009f0d 00000084 bios.obj (.text:_extendbios)
00009f91 00000001 bios.obj (.text:_run)
00009f92 00000083 shared_ump.obj (.text:_ump_rtu_encode)
0000a015 00000082 DSP2833x_SysCtrl.obj (.text:_InitPll)
0000a097 00000078 bios.obj (.text:_peek)
0000a10f 00000072 ecan.obj (.text:_Handlai)
0000a181 00000071 shared_ump.obj (.text:_ump_validate)
0000a1f2 00000070 log_to_mem.obj (.text:_ump_log_write)
0000a262 0000006e RS485.obj (.text:_RS_TX_Handler)
0000a2d0 00000069 DAC.obj (.text:_Load_protection_prepare)
0000a339 00000062 measure.obj (.text:_Init_sensors_more)
0000a39b 00000059 DSP2833x_Xintf.obj (.text:_InitXintf16Gpio)
0000a3f4 00000057 bios.obj (.text:_get_command)
0000a44b 00000050 message.obj (.text:_ReceiveCommandModbus6)
0000a49b 0000004e DAC.obj (.text:_anal_output)
0000a4e9 0000004e DAC.obj (.text:_load_start)
0000a537 0000004d shared_ump.obj (.text:_ump_prepare)
0000a584 0000004c RS485.obj (.text:_RS_FifoStart)
0000a5d0 0000004b RS485.obj (.text:_RS_Send)
0000a61b 0000004a ecan.obj (.text:_CANa_handler)
0000a665 00000049 bios.obj (.text:_load)
0000a6ae 00000048 ecan.obj (.text:_CAN_send)
0000a6f6 00000047 bios.obj (.text:_initload)
0000a73d 00000046 RS485.obj (.text:_RSA_RX_Handler)
0000a783 00000046 RS485.obj (.text:_RSA_TX_Handler)
0000a7c9 00000046 RS485.obj (.text:_RSB_RX_Handler)
0000a80f 00000046 RS485.obj (.text:_RSB_TX_Handler)
0000a855 00000046 rts2800_fpu32.lib : boot.obj (.text)
0000a89b 00000042 log_to_mem.obj (.text:_ump_log_can)
0000a8dd 00000041 RS485.obj (.text:_RS_FifoAbort)
0000a91e 00000041 spise2p.obj (.text:_Seeprom_read)
0000a95f 00000041 spise2p.obj (.text:_Seeprom_write)
0000a9a0 00000041 RS485.obj (.text:_setup_arr_cmd_length)
0000a9e1 00000040 message.obj (.text:_Load_params)
0000aa21 0000003e tools.obj (.text:_init_zone7)
0000aa5f 0000003b DSP2833x_CpuTimers.obj (.text:_InitCpuTimers)
0000aa9a 0000003b DAC.obj (.text:_Load_voltage_can)
0000aad5 0000003b shared_ump.obj (.text:_ump_can_fragment)
0000ab10 0000003a bios.obj (.text:_poke)
0000ab4a 00000039 spise2p.obj (.text:_cpu_timer2_isr)
0000ab83 00000038 message.obj (.text:_SendCommandModbus4)
0000abbb 00000038 shared_ump.obj (.text:_ump_tms28335_fragment)
0000abf3 00000037 RS485.obj (.text:_RS_BSend)
0000ac2a 00000037 message.obj (.text:_ReceiveAnswerModbus4)
0000ac61 00000033 bios.obj (.text:_Answer)
0000ac94 00000033 message.obj (.text:_modbus_exception)
0000acc7 00000033 log_to_mem.obj (.text:_ump_word)
0000acfa 00000032 spise2p.obj (.text:_SPISE2P_DRV_init)
0000ad2c 00000032 peripher.obj (.text:_unsetup_leds_line)
0000ad5e 00000031 DAC.obj (.text:_dSEND)
0000ad8f 0000002f RS485.obj (.text:_RS_FifoTick1ms)
0000adbe 0000002e filter_bat2.obj (.text:_filterbat)
0000adec 0000002e log_to_mem.obj (.text:_ump_log_io)
0000ae1a 0000002d RS485.obj (.text:_RS_SetLineMode)
0000ae47 0000002d main.obj (.text:_timer_Init)
0000ae74 0000002c crc16.obj (.text:_get_crc_16b)
0000aea0 0000002b ecan.obj (.text:_CANa_reset_err)
0000aecb 0000002a rts2800_fpu32.lib : l_div.obj (.text)
0000aef5 00000029 spise2p.obj (.text:_InitSeeprom)
0000af1e 00000027 crc16.obj (.text:_get_crc16)
0000af45 00000026 RS485.obj (.text:_RS_SetLineSpeed)
0000af6b 00000024 message.obj (.text:_Save_params)
0000af8f 00000024 DAC.obj (.text:_load_stop)
0000afb3 00000024 peripher.obj (.text:_select_tpl_255)
0000afd7 00000022 peripher.obj (.text:_setup_leds_line)
0000aff9 00000021 DSP2833x_CpuTimers.obj (.text:_ConfigCpuTimer)
0000b01a 00000020 DAC.obj (.text:_Setup_DAC_time)
0000b03a 00000020 rts2800_fpu32.lib : sqrt.obj (.text)
0000b05a 0000001f DSP2833x_PieCtrl.obj (.text:_InitPieCtrl)
0000b079 0000001f measure.obj (.text:_reset_errs)
0000b098 0000001e DAC.obj (.text:_Load_control_init)
0000b0b6 0000001e kanal.obj (.text:_SENDBIT)
0000b0d4 0000001d log_to_mem.obj (.text:_ump_log_init)
0000b0f1 0000001d shared_ump.obj (.text:_ump_tms28335_prepare)
0000b10e 0000001d pulto.obj (.text:_what_is)
0000b12b 0000001c DAC.obj (.text:_Init_DAC)
0000b147 0000001c measure.obj (.text:_im_calc)
0000b163 0000001c shared_ump.obj (.text:_ump_crc)
0000b17f 0000001c shared_ump.obj (.text:_ump_tms28335_capture)
0000b19b 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ADCINT_ISR)
0000b1b6 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_DINTCH1_ISR)
0000b1d1 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_DINTCH2_ISR)
0000b1ec 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_DINTCH3_ISR)
0000b207 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_DINTCH4_ISR)
0000b222 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_DINTCH5_ISR)
0000b23d 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_DINTCH6_ISR)
0000b258 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAN0INTA_ISR)
0000b273 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAN0INTB_ISR)
0000b28e 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAN1INTA_ISR)
0000b2a9 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAN1INTB_ISR)
0000b2c4 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAP1_INT_ISR)
0000b2df 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAP2_INT_ISR)
0000b2fa 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAP3_INT_ISR)
0000b315 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAP4_INT_ISR)
0000b330 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAP5_INT_ISR)
0000b34b 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ECAP6_INT_ISR)
0000b366 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM1_INT_ISR)
0000b381 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM1_TZINT_ISR)
0000b39c 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM2_INT_ISR)
0000b3b7 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM2_TZINT_ISR)
0000b3d2 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM3_INT_ISR)
0000b3ed 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM3_TZINT_ISR)
0000b408 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM4_INT_ISR)
0000b423 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM4_TZINT_ISR)
0000b43e 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM5_INT_ISR)
0000b459 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM5_TZINT_ISR)
0000b474 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM6_INT_ISR)
0000b48f 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EPWM6_TZINT_ISR)
0000b4aa 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EQEP1_INT_ISR)
0000b4c5 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EQEP2_INT_ISR)
0000b4e0 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_I2CINT1A_ISR)
0000b4fb 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_I2CINT2A_ISR)
0000b516 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_LUF_ISR)
0000b531 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_LVF_ISR)
0000b54c 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_MRINTA_ISR)
0000b567 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_MRINTB_ISR)
0000b582 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_MXINTA_ISR)
0000b59d 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_MXINTB_ISR)
0000b5b8 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SCIRXINTA_ISR)
0000b5d3 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SCIRXINTB_ISR)
0000b5ee 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SCIRXINTC_ISR)
0000b609 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SCITXINTA_ISR)
0000b624 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SCITXINTB_ISR)
0000b63f 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SCITXINTC_ISR)
0000b65a 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SEQ1INT_ISR)
0000b675 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SEQ2INT_ISR)
0000b690 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SPIRXINTA_ISR)
0000b6ab 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_SPITXINTA_ISR)
0000b6c6 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_TINT0_ISR)
0000b6e1 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_WAKEINT_ISR)
0000b6fc 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_XINT3_ISR)
0000b717 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_XINT4_ISR)
0000b732 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_XINT5_ISR)
0000b74d 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_XINT6_ISR)
0000b768 0000001b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_XINT7_ISR)
0000b783 0000001b rts2800_fpu32.lib : args_main.obj (.text)
0000b79e 0000001a RS485.obj (.text:_RS_SetBitMode)
0000b7b8 0000001a RS485.obj (.text:_create_uart_vars)
0000b7d2 00000019 DSP2833x_Adc.obj (.text:_InitAdc)
0000b7eb 00000019 DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_XINT1_ISR)
0000b804 00000019 DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_XINT2_ISR)
0000b81d 00000019 rts2800_fpu32.lib : exit.obj (.text)
0000b836 00000019 : prolog.obj (.text)
0000b84f 00000018 kanal.obj (.text:_RESET)
0000b867 00000018 log_to_mem.obj (.text:_ump_log_tick)
0000b87f 00000017 log_to_mem.obj (.text:_clear_mem)
0000b896 00000016 DSP2833x_SysCtrl.obj (.text:_ServiceDog)
0000b8ac 00000014 bios.obj (.text:__getbyte)
0000b8c0 00000014 measure.obj (.text:_er_anal)
0000b8d4 00000014 log_to_mem.obj (.text:_ump_outputs)
0000b8e8 00000013 RS485.obj (.text:_RS_FifoWait)
0000b8fb 00000013 log_to_mem.obj (.text:_ump_inputs)
0000b90e 00000012 crc16.obj (.text:_get_crc_16)
0000b920 00000010 tools.obj (.text:_pause_us)
0000b930 00000010 shared_ump.obj (.text:_read_word)
0000b940 0000000d DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_DATALOG_ISR)
0000b94d 0000000d DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_INT13_ISR)
0000b95a 0000000d DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_INT14_ISR)
0000b967 0000000d DSP2833x_SWPrioritizedPieVect.obj (.text:_InitPieVectTable)
0000b974 0000000d DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_RTOSINT_ISR)
0000b981 0000000c rts2800_fpu32.lib : epilog.obj (.text)
0000b98d 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_EMUINT_ISR)
0000b998 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_ILLEGAL_ISR)
0000b9a3 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_NMI_ISR)
0000b9ae 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER10_ISR)
0000b9b9 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER11_ISR)
0000b9c4 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER12_ISR)
0000b9cf 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER1_ISR)
0000b9da 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER2_ISR)
0000b9e5 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER3_ISR)
0000b9f0 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER4_ISR)
0000b9fb 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER5_ISR)
0000ba06 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER6_ISR)
0000ba11 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER7_ISR)
0000ba1c 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER8_ISR)
0000ba27 0000000b DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_USER9_ISR)
0000ba32 0000000b log_to_mem.obj (.text:_ump_log_rs)
0000ba3d 0000000b rts2800_fpu32.lib : u_div.obj (.text)
0000ba48 0000000a DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_INT_NOTUSED_ISR)
0000ba52 0000000a DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_PIE_RESERVED)
0000ba5c 0000000a DSP2833x_SWPrioritizedDefaultIsr.obj (.text:_rsvd_ISR)
0000ba66 00000009 DSP2833x_PieCtrl.obj (.text:_EnableInterrupts)
0000ba6f 00000009 DSP2833x_SysCtrl.obj (.text:_InitSysCtrl)
0000ba78 00000009 rts2800_fpu32.lib : _lock.obj (.text)
0000ba81 00000008 DSP2833x_SysCtrl.obj (.text:_DisableDog)
0000ba89 00000007 rts2800_fpu32.lib : memset.obj (.text)
0000ba90 00000005 spise2p.obj (.text:_SPISE2P_DRV_csclr)
0000ba95 00000005 spise2p.obj (.text:_SPISE2P_DRV_csset)
0000ba9a 00000005 cntrl_adr.obj (.text:_set_cntrl_addr)
0000ba9f 00000004 DSP2833x_usDelay.obj (.text)
0000baa3 00000003 shared_ump.obj (.text:_write_word)
0000baa6 00000001 bios.obj (.text:_tflash)
ramfuncs 0 0000c000 00000000 UNINITIALIZED
.econst 0 0000c28c 00000125
0000c28c 00000100 DSP2833x_SWPrioritizedPieVect.obj (.econst:_PieVectTableInit)
0000c38c 00000009 message.obj (.econst:_$P$T0$1)
0000c395 00000001 --HOLE-- [fill = 0]
0000c396 00000006 shared_ump.obj (.econst:_$P$T0$1)
0000c39c 00000006 message.obj (.econst:_$P$T1$2)
0000c3a2 00000006 shared_ump.obj (.econst:_$P$T1$2)
0000c3a8 00000006 shared_ump.obj (.econst:_$P$T2$3)
0000c3ae 00000003 cntrl_adr.obj (.econst)
.econst 0 0000c274 0000012b
0000c274 00000100 DSP2833x_SWPrioritizedPieVect.obj (.econst:_PieVectTableInit)
0000c374 0000000c shared_ump.obj (.econst:_firmware_identity_words)
0000c380 00000009 message.obj (.econst:_$P$T0$1)
0000c389 00000001 --HOLE-- [fill = 0]
0000c38a 00000006 shared_ump.obj (.econst:_$P$T0$1)
0000c390 00000006 message.obj (.econst:_$P$T1$2)
0000c396 00000006 shared_ump.obj (.econst:_$P$T2$3)
0000c39c 00000003 cntrl_adr.obj (.econst)
.switch 0 0000c3b2 00000048
0000c3b2 00000028 spise2p.obj (.switch:_SPISE2P_DRV_tick)
0000c3da 00000020 log_to_mem.obj (.switch:_ump_log_read)
.switch 0 0000c3a0 00000048
0000c3a0 00000028 spise2p.obj (.switch:_SPISE2P_DRV_tick)
0000c3c8 00000020 log_to_mem.obj (.switch:_ump_log_read)
.stack 1 00000400 000003f0 UNINITIALIZED
00000400 000003f0 --HOLE--
.ebss 1 0000d000 00000fdf UNINITIALIZED
0000d000 00000704 RS485.obj (.ebss)
0000d704 00000038 measure.obj (.ebss:_sens_count)
.ebss 1 0000d000 0000105e UNINITIALIZED
0000d000 0000070a RS485.obj (.ebss)
0000d70a 00000020 measure.obj (.ebss:_din_count)
0000d72a 00000012 measure.obj (.ebss:_powK)
0000d73c 00000004 ADC.obj (.ebss:_adc_table_lem)
0000d740 000001b0 measure.obj (.ebss:_adc_filter)
0000d8f0 00000010 measure.obj (.ebss:_Maska)
@@ -201,45 +382,44 @@ ramfuncs 0 0000c000 00000000 UNINITIALIZED
0000dac0 00000100 crc16.obj (.ebss:_crc_16_tab)
0000dbc0 00000081 message.obj (.ebss:_modbus)
0000dc41 00000001 bios.obj (.ebss)
0000dc42 00000038 measure.obj (.ebss)
0000dc42 00000038 measure.obj (.ebss:_sens_count)
0000dc7a 00000006 DSP2833x_SysCtrl.obj (.ebss)
0000dc80 00000081 message.obj (.ebss:_param)
0000dd01 00000001 rts2800_fpu32.lib : errno.obj (.ebss)
0000dd02 00000028 log_to_mem.obj (.ebss)
0000dd2a 00000012 measure.obj (.ebss:_powK)
0000dd3c 00000004 cntrl_adr.obj (.ebss)
0000dd01 00000001 main.obj (.ebss)
0000dd02 00000038 measure.obj (.ebss)
0000dd3a 00000006 measure.obj (.ebss:_err_count)
0000dd40 0000007c ecan.obj (.ebss:_ump_can_reply)
0000ddbc 00000004 rts2800_fpu32.lib : _lock.obj (.ebss)
0000ddc0 00000048 measure.obj (.ebss:_zer_filter)
0000de08 00000020 measure.obj (.ebss:_din_count)
0000de28 00000018 DSP2833x_CpuTimers.obj (.ebss)
0000de40 00000046 RS485.obj (.ebss:_RS_Len)
0000de86 0000001c ADC.obj (.ebss:_ADC_table)
0000dea2 0000001c ADC.obj (.ebss:_prev_ok)
0000debe 00000002 main.obj (.ebss:_cancell$2)
0000dec0 00000040 message.obj (.ebss:_def_cal)
0000df00 0000001c spise2p.obj (.ebss)
0000df1c 00000018 measure.obj (.ebss:_sens_pair)
0000df34 0000000c ADC.obj (.ebss)
0000df40 00000018 measure.obj (.ebss:_sens_type)
0000df58 00000018 ecan.obj (.ebss)
0000df70 00000010 peripher.obj (.ebss)
0000df80 0000000e DAC.obj (.ebss)
0000df8e 0000000c measure.obj (.ebss:_lev_quadr)
0000df9a 0000000a pulto.obj (.ebss)
0000dfa4 00000008 measure.obj (.ebss:_ext_diag)
0000dfac 00000008 measure.obj (.ebss:_ext_temp)
0000dfb4 00000008 measure.obj (.ebss:_zer_count)
0000dfbc 00000004 rts2800_fpu32.lib : exit.obj (.ebss)
0000dfc0 00000006 measure.obj (.ebss:_err_count)
0000dfc6 00000006 measure.obj (.ebss:_lev_count)
0000dfcc 00000005 kanal.obj (.ebss:_readr)
0000dfd1 00000003 log_to_mem.obj (.ebss:_ump_can_data)
0000dfd4 00000003 main.obj (.ebss)
0000dfd7 00000002 main.obj (.ebss:_cancount$1)
0000dfd9 00000002 ADC.obj (.ebss:_cwnt_ok$4)
0000dfdb 00000002 measure.obj (.ebss:_low_count)
0000dfdd 00000002 log_to_mem.obj (.ebss:_ump_pm67_voltage)
0000ddbc 00000004 cntrl_adr.obj (.ebss)
0000ddc0 0000007c message.obj (.ebss:_words$3)
0000de3c 00000004 rts2800_fpu32.lib : _lock.obj (.ebss)
0000de40 00000048 measure.obj (.ebss:_zer_filter)
0000de88 00000020 log_to_mem.obj (.ebss)
0000dea8 00000018 DAC.obj (.ebss)
0000dec0 00000046 RS485.obj (.ebss:_RS_Len)
0000df06 0000001c ADC.obj (.ebss:_ADC_table)
0000df22 0000001c ADC.obj (.ebss:_prev_ok)
0000df3e 00000002 main.obj (.ebss:_cancell$2)
0000df40 00000040 message.obj (.ebss:_def_cal)
0000df80 0000001c spise2p.obj (.ebss)
0000df9c 00000018 DSP2833x_CpuTimers.obj (.ebss)
0000dfb4 0000000c ADC.obj (.ebss)
0000dfc0 00000018 measure.obj (.ebss:_sens_pair)
0000dfd8 00000018 measure.obj (.ebss:_sens_type)
0000dff0 00000010 peripher.obj (.ebss)
0000e000 00000018 ecan.obj (.ebss)
0000e018 0000000c measure.obj (.ebss:_lev_quadr)
0000e024 0000000a pulto.obj (.ebss)
0000e02e 00000008 measure.obj (.ebss:_ext_diag)
0000e036 00000008 measure.obj (.ebss:_ext_temp)
0000e03e 00000002 main.obj (.ebss:_cancount$1)
0000e040 00000008 measure.obj (.ebss:_zer_count)
0000e048 00000006 measure.obj (.ebss:_lev_count)
0000e04e 00000005 kanal.obj (.ebss:_readr)
0000e053 00000001 rts2800_fpu32.lib : errno.obj (.ebss)
0000e054 00000004 : exit.obj (.ebss)
0000e058 00000002 ADC.obj (.ebss:_cwnt_ok$4)
0000e05a 00000002 measure.obj (.ebss:_low_count)
0000e05c 00000002 log_to_mem.obj (.ebss:_ump_pm67_voltage)
.logg 1 00200000 0000fa00 UNINITIALIZED
00200000 0000fa00 log_to_mem.obj (.logg)
@@ -458,16 +638,16 @@ MODULE SUMMARY
------ ---- ---------------- ------------------
K:\git_project\Balsam_167_periph\Debug\Source\External\v120\DSP2833x_common\source\
DSP2833x_SWPrioritizedDefaultIsr.obj 1809 0 0
DSP2833x_SysCtrl.obj 349 0 6
DSP2833x_SWPrioritizedPieVect.obj 14 256 0
DSP2833x_Xintf.obj 268 0 0
DSP2833x_CpuTimers.obj 94 0 24
DSP2833x_SysCtrl.obj 302 0 6
DSP2833x_SWPrioritizedPieVect.obj 13 256 0
DSP2833x_CpuTimers.obj 92 0 24
DSP2833x_Xintf.obj 89 0 0
DSP2833x_PieCtrl.obj 40 0 0
DSP2833x_Adc.obj 25 0 0
DSP2833x_ADC_cal.obj 7 0 0
DSP2833x_usDelay.obj 4 0 0
+--+--------------------------------------+-------+------------------+--------------------+
Total: 2610 256 30
Total: 2381 256 30
K:\git_project\Balsam_167_periph\Debug\Source\External\v120\DSP2833x_headers\source\
DSP2833x_GlobalVariableDefs.obj 0 0 2679
@@ -475,26 +655,26 @@ MODULE SUMMARY
Total: 0 0 2679
K:\git_project\Balsam_167_periph\Debug\Source\Internal\
log_to_mem.obj 895 52 64045
measure.obj 2731 87 1212
RS485.obj 1233 8 1866
message.obj 805 82 322
peripher.obj 963 32 16
ADC.obj 905 13 74
ecan.obj 622 28 148
shared_ump.obj 777 18 0
spise2p.obj 660 71 28
bios.obj 703 4 1
crc16.obj 117 259 256
main.obj 589 8 7
DAC.obj 394 16 14
kanal.obj 364 27 21
pulto.obj 366 17 10
tools.obj 79 0 0
filter_bat2.obj 55 0 0
log_to_mem.obj 718 52 64034
measure.obj 2458 87 1212
RS485.obj 1615 8 1872
message.obj 875 82 446
peripher.obj 972 32 16
ADC.obj 874 13 74
DAC.obj 843 0 24
ecan.obj 643 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 460 0 5
pulto.obj 352 17 10
kanal.obj 321 27 21
tools.obj 78 0 0
filter_bat2.obj 46 0 0
cntrl_adr.obj 5 11 4
+--+--------------------------------------+-------+------------------+--------------------+
Total: 12263 733 68024
Total: 12245 715 68151
K:/git_project/Balsam_167_periph/Libraries/rts2800_fpu32.lib
fs_div.obj 136 0 0
@@ -503,15 +683,18 @@ MODULE SUMMARY
exit.obj 25 10 4
sqrt.obj 32 0 0
args_main.obj 27 0 0
prolog.obj 25 0 0
_lock.obj 9 10 4
epilog.obj 12 0 0
u_div.obj 11 0 0
memset.obj 7 0 0
errno.obj 0 4 1
+--+--------------------------------------+-------+------------------+--------------------+
Total: 352 24 9
Total: 396 24 9
Stack: 0 0 1008
+--+--------------------------------------+-------+------------------+--------------------+
Grand Total: 15225 1013 71750
Grand Total: 15022 995 71877
GLOBAL DATA SYMBOLS: SORTED BY DATA PAGE
@@ -606,17 +789,18 @@ address data page name
00007900 1e4 (00007900) _I2caRegs
0000c28c 30a (0000c280) _PieVectTableInit
0000c274 309 (0000c240) _PieVectTableInit
0000c3ae 30e (0000c380) _ADDR_ANSWER
0000c3af 30e (0000c380) _ADDR_TERMINAL
0000c3b0 30e (0000c380) _CNTRL_ADDR_UNIVERSAL
0000c39c 30e (0000c380) _ADDR_ANSWER
0000c39d 30e (0000c380) _ADDR_TERMINAL
0000c39e 30e (0000c380) _CNTRL_ADDR_UNIVERSAL
0000d040 341 (0000d040) _rs_a
0000d3c0 34f (0000d3c0) _rs_b
0000d704 35c (0000d700) _sens_count
0000d70a 35c (0000d700) _din_count
0000d72a 35c (0000d700) _powK
0000d73c 35c (0000d700) _adc_table_lem
0000d740 35d (0000d740) _adc_filter
@@ -632,121 +816,116 @@ address data page name
0000dbc0 36f (0000dbc0) _modbus
0000dc41 371 (0000dc40) _flag_DEBUG
0000dc42 371 (0000dc40) _CanPowse
0000dc43 371 (0000dc40) _CanGO
0000dc44 371 (0000dc40) _READY
0000dc45 371 (0000dc40) _TPL_CANS
0000dc46 371 (0000dc40) _tpl_cans
0000dc47 371 (0000dc40) _cal_addr
0000dc48 371 (0000dc40) _pow_addr
0000dc49 371 (0000dc40) _period_ready
0000dc4a 371 (0000dc40) _period_blink
0000dc4b 371 (0000dc40) _chk
0000dc4c 371 (0000dc40) _sig
0000dc4d 371 (0000dc40) _time_1_5sec
0000dc4e 371 (0000dc40) _time_5msec
0000dc4f 371 (0000dc40) _time_3sec
0000dc50 371 (0000dc40) _time_5sec
0000dc51 371 (0000dc40) _Caliber_time
0000dc52 371 (0000dc40) _Curr_Edge
0000dc53 371 (0000dc40) _okay
0000dc5e 371 (0000dc40) _K100
0000dc60 371 (0000dc40) _K_50
0000dc62 371 (0000dc40) _K_T1
0000dc64 371 (0000dc40) _K_T2
0000dc68 371 (0000dc40) _def_FILTERBAT
0000dc42 371 (0000dc40) _sens_count
0000dc7a 371 (0000dc40) _SYSCLKOUT
0000dc7c 371 (0000dc40) _LSPCLK
0000dc7e 371 (0000dc40) _HSPCLK
0000dc80 372 (0000dc80) _param
0000dd01 374 (0000dd00) _errno
0000dd02 374 (0000dd00) _no_write
0000dd03 374 (0000dd00) _never_write
0000dd04 374 (0000dd00) _flog
0000dd18 374 (0000dd00) _ump_dac_ramp
0000dd19 374 (0000dd00) _ump_dac_duration
0000dd1a 374 (0000dd00) _ump_dac_go10
0000dd1b 374 (0000dd00) _ump_dac_stop10
0000dd1c 374 (0000dd00) _ump_dac_position
0000dd22 374 (0000dd00) _Log
0000dd2a 374 (0000dd00) _powK
0000dd3c 374 (0000dd00) _ADDR_FOR_ALL
0000dd3d 374 (0000dd00) _CNTRL_ADDR
0000dd3e 374 (0000dd00) _cntr_addr_c
0000dd3f 374 (0000dd00) _cntr_addr_c_all
0000dd02 374 (0000dd00) _CanPowse
0000dd03 374 (0000dd00) _CanGO
0000dd04 374 (0000dd00) _READY
0000dd05 374 (0000dd00) _TPL_CANS
0000dd06 374 (0000dd00) _tpl_cans
0000dd07 374 (0000dd00) _cal_addr
0000dd08 374 (0000dd00) _pow_addr
0000dd09 374 (0000dd00) _period_ready
0000dd0a 374 (0000dd00) _period_blink
0000dd0b 374 (0000dd00) _chk
0000dd0c 374 (0000dd00) _sig
0000dd0d 374 (0000dd00) _time_1_5sec
0000dd0e 374 (0000dd00) _time_5msec
0000dd0f 374 (0000dd00) _time_3sec
0000dd10 374 (0000dd00) _time_5sec
0000dd11 374 (0000dd00) _Caliber_time
0000dd12 374 (0000dd00) _Curr_Edge
0000dd13 374 (0000dd00) _okay
0000dd1e 374 (0000dd00) _K100
0000dd20 374 (0000dd00) _K_50
0000dd22 374 (0000dd00) _K_T1
0000dd24 374 (0000dd00) _K_T2
0000dd28 374 (0000dd00) _def_FILTERBAT
0000dd3a 374 (0000dd00) _err_count
0000ddbc 376 (0000dd80) __unlock
0000ddbe 376 (0000dd80) __lock
0000ddbc 376 (0000dd80) _ADDR_FOR_ALL
0000ddbd 376 (0000dd80) _CNTRL_ADDR
0000ddbe 376 (0000dd80) _cntr_addr_c
0000ddbf 376 (0000dd80) _cntr_addr_c_all
0000ddc0 377 (0000ddc0) _zer_filter
0000de3c 378 (0000de00) __unlock
0000de3e 378 (0000de00) __lock
0000de08 378 (0000de00) _din_count
0000de28 378 (0000de00) _CpuTimer0
0000de30 378 (0000de00) _CpuTimer1
0000de38 378 (0000de00) _CpuTimer2
0000de40 379 (0000de40) _zer_filter
0000de40 379 (0000de40) _RS_Len
0000de88 37a (0000de80) _no_write
0000de89 37a (0000de80) _never_write
0000de8a 37a (0000de80) _flog
0000dea0 37a (0000de80) _Log
0000dea8 37a (0000de80) _period_dac
0000dea9 37a (0000de80) _time_dac
0000deb8 37a (0000de80) _WAKEpowse
0000deba 37a (0000de80) _IMPowse
0000de86 37a (0000de80) _ADC_table
0000dea2 37a (0000de80) _prev_ok
0000dec0 37b (0000dec0) _RS_Len
0000dec0 37b (0000dec0) _def_cal
0000df06 37c (0000df00) _ADC_table
0000df22 37c (0000df00) _prev_ok
0000df00 37c (0000df00) _ccc
0000df1c 37c (0000df00) _sens_pair
0000df34 37c (0000df00) _COUNT_ONE_CANAL
0000df35 37c (0000df00) _COUNT_DISCHARGE
0000df36 37c (0000df00) _COUNT_TRANSICIA
0000df37 37c (0000df00) _FILTER_CLIP
0000df3c 37c (0000df00) _WAKE
0000df3e 37c (0000df00) _WAKE_TIME
0000df40 37d (0000df40) _def_cal
0000df40 37d (0000df40) _sens_type
0000df58 37d (0000df40) _CanTimeOutErrorTR
0000df59 37d (0000df40) _wait
0000df62 37d (0000df40) _ErrorCount
0000df64 37d (0000df40) _MessageReceivedCount
0000df66 37d (0000df40) _MessageTransivedCount
0000df68 37d (0000df40) _TestMbox1
0000df6a 37d (0000df40) _TestMbox2
0000df6c 37d (0000df40) _TestMbox3
0000df70 37d (0000df40) _Mode
0000df71 37d (0000df40) _Desk
0000df72 37d (0000df40) _TermoAD
0000df73 37d (0000df40) _TermoRS
0000df74 37d (0000df40) _TermoSW
0000df75 37d (0000df40) _Kurrent
0000df76 37d (0000df40) _Kalibro
0000df77 37d (0000df40) _Owen
0000df78 37d (0000df40) _INcount0
0000df79 37d (0000df40) _INcount1
0000df7a 37d (0000df40) _MUX_GPIO32
0000df7b 37d (0000df40) _MUX_GPIO48
0000df7c 37d (0000df40) _DIR_GPIO32
0000df7d 37d (0000df40) _DIR_GPIO48
0000df7e 37d (0000df40) _DigErr
0000df80 37e (0000df80) _ccc
0000df9c 37e (0000df80) _CpuTimer0
0000dfa4 37e (0000df80) _CpuTimer1
0000dfac 37e (0000df80) _CpuTimer2
0000dfb4 37e (0000df80) _COUNT_ONE_CANAL
0000dfb5 37e (0000df80) _COUNT_DISCHARGE
0000dfb6 37e (0000df80) _COUNT_TRANSICIA
0000dfb7 37e (0000df80) _FILTER_CLIP
0000dfbc 37e (0000df80) _WAKE
0000dfbe 37e (0000df80) _WAKE_TIME
0000df80 37e (0000df80) _period_dac
0000df81 37e (0000df80) _time_dac
0000df86 37e (0000df80) _WAKEpowse
0000df88 37e (0000df80) _IMPowse
0000df8e 37e (0000df80) _lev_quadr
0000df9a 37e (0000df80) _isNumb
0000df9b 37e (0000df80) _quaLamp
0000dfa0 37e (0000df80) _isMask
0000dfa2 37e (0000df80) _Lonely
0000dfa4 37e (0000df80) _ext_diag
0000dfac 37e (0000df80) _ext_temp
0000dfb4 37e (0000df80) _zer_count
0000dfbc 37e (0000df80) __cleanup_ptr
0000dfbe 37e (0000df80) __dtors_ptr
0000dfc0 37f (0000dfc0) _sens_pair
0000dfd8 37f (0000dfc0) _sens_type
0000dff0 37f (0000dfc0) _Mode
0000dff1 37f (0000dfc0) _Desk
0000dff2 37f (0000dfc0) _TermoAD
0000dff3 37f (0000dfc0) _TermoRS
0000dff4 37f (0000dfc0) _TermoSW
0000dff5 37f (0000dfc0) _Kurrent
0000dff6 37f (0000dfc0) _Kalibro
0000dff7 37f (0000dfc0) _Owen
0000dff8 37f (0000dfc0) _INcount0
0000dff9 37f (0000dfc0) _INcount1
0000dffa 37f (0000dfc0) _MUX_GPIO32
0000dffb 37f (0000dfc0) _MUX_GPIO48
0000dffc 37f (0000dfc0) _DIR_GPIO32
0000dffd 37f (0000dfc0) _DIR_GPIO48
0000dffe 37f (0000dfc0) _DigErr
0000dfc0 37f (0000dfc0) _err_count
0000dfc6 37f (0000dfc0) _lev_count
0000dfcc 37f (0000dfc0) _readr
0000dfdb 37f (0000dfc0) _low_count
0000e000 380 (0000e000) _CanTimeOutErrorTR
0000e001 380 (0000e000) _wait
0000e00a 380 (0000e000) _ErrorCount
0000e00c 380 (0000e000) _MessageReceivedCount
0000e00e 380 (0000e000) _MessageTransivedCount
0000e010 380 (0000e000) _TestMbox1
0000e012 380 (0000e000) _TestMbox2
0000e014 380 (0000e000) _TestMbox3
0000e018 380 (0000e000) _lev_quadr
0000e024 380 (0000e000) _isNumb
0000e025 380 (0000e000) _quaLamp
0000e02a 380 (0000e000) _isMask
0000e02c 380 (0000e000) _Lonely
0000e02e 380 (0000e000) _ext_diag
0000e036 380 (0000e000) _ext_temp
0000e040 381 (0000e040) _zer_count
0000e048 381 (0000e040) _lev_count
0000e04e 381 (0000e040) _readr
0000e053 381 (0000e040) _errno
0000e054 381 (0000e040) __cleanup_ptr
0000e056 381 (0000e040) __dtors_ptr
0000e05a 381 (0000e040) _low_count
00200000 8000 (00200000) _logs_block
@@ -757,851 +936,831 @@ address data page name
GLOBAL SYMBOLS: SORTED ALPHABETICALLY BY Name
page address name
---- ------- ----
0 00008000 .text
0 0000bb2f C$$EXIT
0 0000b796 FS$$DIV
0 0000ba6b L$$DIV
0 0000ba7a L$$MOD
0 0000bb56 U$$DIV
0 0000bb5b U$$MOD
0 0000ba88 UL$$DIV
0 0000ba8f UL$$MOD
0 00008fdc _ADCINT_ISR
0 00380080 _ADC_cal
1 0000de86 _ADC_table
0 0000c3ae _ADDR_ANSWER
1 0000dd3c _ADDR_FOR_ALL
0 0000c3af _ADDR_TERMINAL
1 00000b00 _AdcMirror
1 00007100 _AdcRegs
0 0000b01b _Anal_output
0 0000a1b2 _Answer
0 0000aa38 _CAN_send
0 0000b8be _CANa_handler
0 0000b893 _CANa_reset_err
1 0000dd3d _CNTRL_ADDR
0 0000c3b0 _CNTRL_ADDR_UNIVERSAL
1 0000df35 _COUNT_DISCHARGE
1 0000df34 _COUNT_ONE_CANAL
1 0000df36 _COUNT_TRANSICIA
1 0000dc51 _Caliber_time
1 0000dc43 _CanGO
1 0000dc42 _CanPowse
1 0000df58 _CanTimeOutErrorTR
0 0000b947 _ConfigCpuTimer
1 0000de28 _CpuTimer0
1 00000c00 _CpuTimer0Regs
1 0000de30 _CpuTimer1
1 00000c08 _CpuTimer1Regs
1 0000de38 _CpuTimer2
1 00000c10 _CpuTimer2Regs
1 0033fff8 _CsmPwl
1 00000ae0 _CsmRegs
0 0000b3f6 _CsmUnlock
1 0000dc52 _Curr_Edge
0 00008656 _Current_count
0 00008fcf _DATALOG_ISR
0 0000b168 _DCLK
0 00008fb4 _DINTCH1_ISR
0 00008f99 _DINTCH2_ISR
0 00008f7e _DINTCH3_ISR
0 00008f63 _DINTCH4_ISR
0 00008f48 _DINTCH5_ISR
0 00008f2d _DINTCH6_ISR
1 0000df7c _DIR_GPIO32
1 0000df7d _DIR_GPIO48
0 0000b15c _DOUT
0 0000bb6f _DSP28x_usDelay
0 00009cba _Default_params
1 0000df71 _Desk
1 00000880 _DevEmuRegs
1 0000df7e _DigErr
0 0000b2de _DisableDog
1 00001000 _DmaRegs
0 00008f12 _ECAN0INTA_ISR
0 00008ef7 _ECAN0INTB_ISR
0 00008edc _ECAN1INTA_ISR
0 00008ec1 _ECAN1INTB_ISR
0 00008ea6 _ECAP1_INT_ISR
0 00008e8b _ECAP2_INT_ISR
0 00008e70 _ECAP3_INT_ISR
0 00008e55 _ECAP4_INT_ISR
0 00008e3a _ECAP5_INT_ISR
0 00008e1f _ECAP6_INT_ISR
1 00006040 _ECanaLAMRegs
1 000060c0 _ECanaMOTORegs
1 00006080 _ECanaMOTSRegs
1 00006100 _ECanaMboxes
1 00006000 _ECanaRegs
1 00006240 _ECanbLAMRegs
1 000062c0 _ECanbMOTORegs
1 00006280 _ECanbMOTSRegs
1 00006300 _ECanbMboxes
1 00006200 _ECanbRegs
1 00006a00 _ECap1Regs
1 00006a20 _ECap2Regs
1 00006a40 _ECap3Regs
1 00006a60 _ECap4Regs
1 00006a80 _ECap5Regs
1 00006aa0 _ECap6Regs
0 00008e14 _EMUINT_ISR
0 00008df9 _EPWM1_INT_ISR
0 00008dde _EPWM1_TZINT_ISR
0 00008dc3 _EPWM2_INT_ISR
0 00008da8 _EPWM2_TZINT_ISR
0 00008d8d _EPWM3_INT_ISR
0 00008d72 _EPWM3_TZINT_ISR
0 00008d57 _EPWM4_INT_ISR
0 00008d3c _EPWM4_TZINT_ISR
0 00008d21 _EPWM5_INT_ISR
0 00008d06 _EPWM5_TZINT_ISR
0 00008ceb _EPWM6_INT_ISR
0 00008cd0 _EPWM6_TZINT_ISR
1 00006800 _EPwm1Regs
1 00006840 _EPwm2Regs
1 00006880 _EPwm3Regs
1 000068c0 _EPwm4Regs
1 00006900 _EPwm5Regs
1 00006940 _EPwm6Regs
0 00008cb5 _EQEP1_INT_ISR
0 00008c9a _EQEP2_INT_ISR
1 00006b00 _EQep1Regs
1 00006b40 _EQep2Regs
0 0000bab4 _EnableInterrupts
1 0000df62 _ErrorCount
1 0000df37 _FILTER_CLIP
1 00000a80 _FlashRegs
1 00006f80 _GpioCtrlRegs
1 00006fc0 _GpioDataRegs
1 00006fe0 _GpioIntRegs
1 0000dc7e _HSPCLK
0 0000a9d9 _Handlai
0 00008c7f _I2CINT1A_ISR
0 00008c64 _I2CINT2A_ISR
1 00007900 _I2caRegs
0 00008c59 _ILLEGAL_ISR
1 0000df88 _IMPowse
0 00008c4c _INT13_ISR
0 00008c3f _INT14_ISR
0 00008c35 _INT_NOTUSED_ISR
1 0000df78 _INcount0
1 0000df79 _INcount1
0 0000bb16 _InitAdc
0 0000a920 _InitCan
0 0000b908 _InitCpuTimers
0 0000b368 _InitPeripheralClocks
0 0000ba95 _InitPieCtrl
0 0000bb48 _InitPieVectTable
0 0000b2e6 _InitPll
0 0000a615 _InitSeeprom
0 0000b3ed _InitSysCtrl
0 0000b733 _InitXintf
0 0000b68a _InitXintf16Gpio
0 0000b6e3 _InitXintf32Gpio
0 0000b064 _Init_DAC
0 000085ae _Init_packMask
0 00008438 _Init_sensors
0 000083d8 _Init_sensors_more
1 0000dc5e _K100
1 0000dc60 _K_50
1 0000dc62 _K_T1
1 0000dc64 _K_T2
1 0000df76 _Kalibro
1 0000df75 _Kurrent
1 0000dc7c _LSPCLK
0 00008c1a _LUF_ISR
0 00008bff _LVF_ISR
0 00009dd6 _Load_params
0 0000b080 _Load_runner
1 0000dd22 _Log
1 0000dfa2 _Lonely
0 00008be4 _MRINTA_ISR
0 00008bc9 _MRINTB_ISR
1 0000df7a _MUX_GPIO32
1 0000df7b _MUX_GPIO48
0 00008bae _MXINTA_ISR
0 00008b93 _MXINTB_ISR
1 0000d8f0 _Maska
1 00005000 _McbspaRegs
1 00005040 _McbspbRegs
1 0000df64 _MessageReceivedCount
1 0000df66 _MessageTransivedCount
1 0000df70 _Mode
0 00008b88 _NMI_ISR
1 0000df77 _Owen
0 00008b7e _PIE_RESERVED
1 00380090 _PartIdRegs
1 00000ce0 _PieCtrlRegs
1 00000d00 _PieVectTable
0 0000c28c _PieVectTableInit
0 000082ee _Power_count
1 0000dc44 _READY
0 0000b186 _RESET
0 0000b645 _RSA_RX_Handler
0 0000b600 _RSA_TX_Handler
0 0000b5bb _RSB_RX_Handler
0 0000b576 _RSB_TX_Handler
0 00009746 _RS_BSend
1 0000de40 _RS_Len
0 000095fc _RS_RX_Handler
0 000095a4 _RS_Send
0 0000944f _RS_SetBitMode
0 000093bb _RS_SetLineMode
0 0000942f _RS_SetLineSpeed
0 0000952b _RS_TX_Handler
0 00008b71 _RTOSINT_ISR
0 0000c000 _RamfuncsLoadEnd
0 0000c000 _RamfuncsLoadStart
0 0000c000 _RamfuncsRunStart
0 00009c90 _ReceiveAnswerModbus4
0 00009c05 _ReceiveCommandModbus3
0 00009bc7 _ReceiveCommandModbus6
0 00008b56 _SCIRXINTA_ISR
0 00008b3b _SCIRXINTB_ISR
0 00008b20 _SCIRXINTC_ISR
0 00008b05 _SCITXINTA_ISR
0 00008aea _SCITXINTB_ISR
0 00008acf _SCITXINTC_ISR
0 0000b174 _SENDBIT
0 00008ab4 _SEQ1INT_ISR
0 00008a99 _SEQ2INT_ISR
0 00008a7e _SPIRXINTA_ISR
0 0000a3f2 _SPISE2P_DRV_csclr
0 0000a3f7 _SPISE2P_DRV_csset
0 0000a3fc _SPISE2P_DRV_init
0 0000a42e _SPISE2P_DRV_tick
0 00008a63 _SPITXINTA_ISR
1 0000dc7a _SYSCLKOUT
0 00009b1e _Save_params
1 00007050 _SciaRegs
1 00007750 _ScibRegs
1 00007770 _ScicRegs
0 0000a5d2 _Seeprom_read
0 0000a58f _Seeprom_write
0 00009af6 _SendCommandModbus4
0 0000b2c8 _ServiceDog
0 0000b011 _Setup_DAC_time
1 00007040 _SpiaRegs
1 00007010 _SysCtrlRegs
0 00008a48 _TINT0_ISR
1 0000dc45 _TPL_CANS
0 00008111 _Temper_count
1 0000df72 _TermoAD
1 0000df73 _TermoRS
1 0000df74 _TermoSW
1 0000df68 _TestMbox1
1 0000df6a _TestMbox2
1 0000df6c _TestMbox3
0 0000a88b _UMP_CAN_service
0 00008a3d _USER10_ISR
0 00008a32 _USER11_ISR
0 00008a27 _USER12_ISR
0 00008a1c _USER1_ISR
0 00008a11 _USER2_ISR
0 00008a06 _USER3_ISR
0 000089fb _USER4_ISR
0 000089f0 _USER5_ISR
0 000089e5 _USER6_ISR
0 000089da _USER7_ISR
0 000089cf _USER8_ISR
0 000089c4 _USER9_ISR
1 0000df3c _WAKE
0 000089a9 _WAKEINT_ISR
1 0000df3e _WAKE_TIME
1 0000df86 _WAKEpowse
0 00008990 _XINT1_ISR
0 00008977 _XINT2_ISR
0 0000895c _XINT3_ISR
0 00008941 _XINT4_ISR
0 00008926 _XINT5_ISR
0 0000890b _XINT6_ISR
0 000088f0 _XINT7_ISR
1 00007070 _XIntruptRegs
1 00000b20 _XintfRegs
1 000007f0 __STACK_END
abs 000003f0 __STACK_SIZE
abs ffffffff ___TI_pprof_out_hndl
abs ffffffff ___TI_prof_data_size
abs ffffffff ___TI_prof_data_start
abs ffffffff ___binit__
abs ffffffff ___c_args__
0 0000c000 ___cinit__
0 0000bb73 ___etext__
abs ffffffff ___pinit__
0 00008000 ___text__
0 0000bafb __args_main
1 0000dfbc __cleanup_ptr
1 0000dfbe __dtors_ptr
1 0000ddbe __lock
0 0000bb69 __nop
0 0000bb65 __register_lock
0 0000bb61 __register_unlock
1 00000400 __stack
1 0000ddbc __unlock
0 0000bb2f _abort
1 0000d740 _adc_filter
0 0000aa84 _adc_isr
1 0000d73c _adc_table_lem
0 0000b9b5 _c_int00
1 0000dc47 _cal_addr
0 00008053 _calc_sensor_koef
1 0000df00 _ccc
1 0000dc4b _chk
0 00009ae1 _clear_mem
0 00009526 _clear_timer_rs_live
1 0000dd3e _cntr_addr_c
1 0000dd3f _cntr_addr_c_all
0 0000b425 _cpu_timer1_isr_PULT
0 0000ac77 _cpu_timer1_isr_SENS
0 0000b9fb _cpu_timer2_isr
1 0000dac0 _crc_16_tab
0 0000951a _create_uart_vars
0 0000afd7 _dOUT
0 0000afe3 _dSEND
1 0000dc68 _def_FILTERBAT
1 0000dec0 _def_cal
1 0000dab0 _digits
1 0000de08 _din_count
0 0000803e _er_anal
1 0000dfc0 _err_count
1 0000dd01 _errno
0 0000bb31 _exit
1 0000dfa4 _ext_diag
1 0000dfac _ext_temp
0 0000a373 _extendbios
0 0000ba34 _filterbat
1 0000dc41 _flag_DEBUG
1 0000dd04 _flog
0 0000921c _get_Buttons
0 000090ff _get_Mode
0 0000a31b _get_command
0 0000b859 _get_crc16
0 0000b848 _get_crc_16
0 0000b81e _get_crc_16b
0 00008022 _im_calc
0 0000a31a _init
0 0000b977 _init_zone7
0 0000a2d7 _initload
1 0000dfa0 _isMask
1 0000df9a _isNumb
0 0000b199 _kanal_Send
1 0000dfc6 _lev_count
1 0000df8e _lev_quadr
0 0000a28f _load
1 00200000 _logs_block
1 0000dfdb _low_count
0 0000a66b _main
1 0000dbc0 _modbus
1 0000dd03 _never_write
1 0000dd02 _no_write
1 0000dc53 _okay
1 0000d900 _out_filter
1 0000dc80 _param
0 0000b966 _pause_us
0 0000a216 _peek
1 0000dc4a _period_blink
1 0000df80 _period_dac
1 0000dc49 _period_ready
0 0000a1da _poke
1 0000dd2a _powK
1 0000dc48 _pow_addr
1 0000dea2 _prev_ok
1 0000df9b _quaLamp
0 0000a1af _read_memory
1 0000dfcc _readr
0 00008000 _reset_errs
1 0000d040 _rs_a
1 0000d3c0 _rs_b
0 000088e6 _rsvd_ISR
0 0000a1ae _run
0 000090db _select_tpl_255
0 0000904b _select_tpl_canal
1 0000d704 _sens_count
1 0000df1c _sens_pair
1 0000df40 _sens_type
0 0000bb6a _set_cntrl_addr
0 0000ae3c _setup_adc
0 000093e8 _setup_arr_cmd_length
0 00009029 _setup_leds_line
0 00009469 _setup_uart
1 0000dc4c _sig
0 0000a3eb _spiSe2pFree
0 0000a3e7 _spiSe2pRead
0 0000a3e3 _spiSe2pWrite
0 0000babe _sqrt
0 000093ba _test_rs_live
0 0000a1ad _tflash
1 0000dc4d _time_1_5sec
1 0000dc4f _time_3sec
1 0000dc4e _time_5msec
1 0000dc50 _time_5sec
1 0000df81 _time_dac
0 0000a63e _timer_Init
1 0000dc46 _tpl_cans
0 00009ff0 _ump_can_fragment
0 0000a110 _ump_can_id
0 0000a0c8 _ump_can_request
0 00009ec3 _ump_crc
1 0000dd19 _ump_dac_duration
1 0000dd1a _ump_dac_go10
1 0000dd1c _ump_dac_position
1 0000dd18 _ump_dac_ramp
1 0000dd1b _ump_dac_stop10
0 00009a92 _ump_log_can
0 00009a5e _ump_log_init
0 00009a30 _ump_log_io
0 00009982 _ump_log_read
0 00009944 _ump_log_rs
0 00009920 _ump_log_tick
0 000098a5 _ump_log_write
0 00009e70 _ump_prepare
0 0000a083 _ump_rtu
0 00009ede _ump_rtu_encode
0 00009f69 _ump_rtu_response
0 0000a063 _ump_tms28335_capture
0 0000a028 _ump_tms28335_fragment
0 00009fd3 _ump_tms28335_prepare
0 00009fb2 _ump_tms28335_rtu
0 00009e1e _ump_validate
0 00008ff7 _unsetup_leds_line
0 0000a128 _upload
1 0000df59 _wait
0 0000afd2 _wast
0 0000bade _what_is
0 0000a125 _write_memory
0 0000a124 _xflash
1 0000dfb4 _zer_count
1 0000ddc0 _zer_filter
abs ffffffff binit
0 0000c000 cinit
0 0000bb73 etext
abs ffffffff pinit
page address name
---- ------- ----
0 00008000 .text
0 0000b81d C$$EXIT
0 00009e00 FS$$DIV
0 0000aecb L$$DIV
0 0000aeda L$$MOD
0 0000ba3d U$$DIV
0 0000ba42 U$$MOD
0 0000aee8 UL$$DIV
0 0000aeef UL$$MOD
0 0000b19b _ADCINT_ISR
0 00380080 _ADC_cal
1 0000df06 _ADC_table
0 0000c39c _ADDR_ANSWER
1 0000ddbc _ADDR_FOR_ALL
0 0000c39d _ADDR_TERMINAL
1 00000b00 _AdcMirror
1 00007100 _AdcRegs
0 0000ac61 _Answer
0 0000a6ae _CAN_send
0 0000a61b _CANa_handler
0 0000aea0 _CANa_reset_err
1 0000ddbd _CNTRL_ADDR
0 0000c39e _CNTRL_ADDR_UNIVERSAL
1 0000dfb5 _COUNT_DISCHARGE
1 0000dfb4 _COUNT_ONE_CANAL
1 0000dfb6 _COUNT_TRANSICIA
1 0000dd11 _Caliber_time
1 0000dd03 _CanGO
1 0000dd02 _CanPowse
1 0000e000 _CanTimeOutErrorTR
0 0000aff9 _ConfigCpuTimer
1 0000df9c _CpuTimer0
1 00000c00 _CpuTimer0Regs
1 0000dfa4 _CpuTimer1
1 00000c08 _CpuTimer1Regs
1 0000dfac _CpuTimer2
1 00000c10 _CpuTimer2Regs
1 0033fff8 _CsmPwl
1 00000ae0 _CsmRegs
1 0000dd12 _Curr_Edge
0 00008000 _Current_count
0 0000b940 _DATALOG_ISR
0 0000b1b6 _DINTCH1_ISR
0 0000b1d1 _DINTCH2_ISR
0 0000b1ec _DINTCH3_ISR
0 0000b207 _DINTCH4_ISR
0 0000b222 _DINTCH5_ISR
0 0000b23d _DINTCH6_ISR
1 0000dffc _DIR_GPIO32
1 0000dffd _DIR_GPIO48
0 0000ba9f _DSP28x_usDelay
0 00009586 _Default_params
1 0000dff1 _Desk
1 00000880 _DevEmuRegs
1 0000dffe _DigErr
0 0000ba81 _DisableDog
1 00001000 _DmaRegs
0 0000b258 _ECAN0INTA_ISR
0 0000b273 _ECAN0INTB_ISR
0 0000b28e _ECAN1INTA_ISR
0 0000b2a9 _ECAN1INTB_ISR
0 0000b2c4 _ECAP1_INT_ISR
0 0000b2df _ECAP2_INT_ISR
0 0000b2fa _ECAP3_INT_ISR
0 0000b315 _ECAP4_INT_ISR
0 0000b330 _ECAP5_INT_ISR
0 0000b34b _ECAP6_INT_ISR
1 00006040 _ECanaLAMRegs
1 000060c0 _ECanaMOTORegs
1 00006080 _ECanaMOTSRegs
1 00006100 _ECanaMboxes
1 00006000 _ECanaRegs
1 00006240 _ECanbLAMRegs
1 000062c0 _ECanbMOTORegs
1 00006280 _ECanbMOTSRegs
1 00006300 _ECanbMboxes
1 00006200 _ECanbRegs
1 00006a00 _ECap1Regs
1 00006a20 _ECap2Regs
1 00006a40 _ECap3Regs
1 00006a60 _ECap4Regs
1 00006a80 _ECap5Regs
1 00006aa0 _ECap6Regs
abs 00007efc _EEPROM_FIRMWARE_LIMIT_BYTES
abs 00007ffe _EEPROM_PARAMS_END_BYTE
abs 00007efc _EEPROM_PARAMS_START_BYTE
abs 00003f7e _EEPROM_PARAMS_START_WORD
abs 00008000 _EEPROM_TOTAL_BYTES
0 0000b98d _EMUINT_ISR
0 0000b366 _EPWM1_INT_ISR
0 0000b381 _EPWM1_TZINT_ISR
0 0000b39c _EPWM2_INT_ISR
0 0000b3b7 _EPWM2_TZINT_ISR
0 0000b3d2 _EPWM3_INT_ISR
0 0000b3ed _EPWM3_TZINT_ISR
0 0000b408 _EPWM4_INT_ISR
0 0000b423 _EPWM4_TZINT_ISR
0 0000b43e _EPWM5_INT_ISR
0 0000b459 _EPWM5_TZINT_ISR
0 0000b474 _EPWM6_INT_ISR
0 0000b48f _EPWM6_TZINT_ISR
1 00006800 _EPwm1Regs
1 00006840 _EPwm2Regs
1 00006880 _EPwm3Regs
1 000068c0 _EPwm4Regs
1 00006900 _EPwm5Regs
1 00006940 _EPwm6Regs
0 0000b4aa _EQEP1_INT_ISR
0 0000b4c5 _EQEP2_INT_ISR
1 00006b00 _EQep1Regs
1 00006b40 _EQep2Regs
0 0000ba66 _EnableInterrupts
1 0000e00a _ErrorCount
1 0000dfb7 _FILTER_CLIP
1 00000a80 _FlashRegs
1 00006f80 _GpioCtrlRegs
1 00006fc0 _GpioDataRegs
1 00006fe0 _GpioIntRegs
1 0000dc7e _HSPCLK
0 0000a10f _Handlai
0 0000b4e0 _I2CINT1A_ISR
0 0000b4fb _I2CINT2A_ISR
1 00007900 _I2caRegs
0 0000b998 _ILLEGAL_ISR
1 0000deba _IMPowse
0 0000b94d _INT13_ISR
0 0000b95a _INT14_ISR
0 0000ba48 _INT_NOTUSED_ISR
1 0000dff8 _INcount0
1 0000dff9 _INcount1
0 0000b7d2 _InitAdc
0 000098a1 _InitCan
0 0000aa5f _InitCpuTimers
0 00009e88 _InitPeripheralClocks
0 0000b05a _InitPieCtrl
0 0000b967 _InitPieVectTable
0 0000a015 _InitPll
0 0000aef5 _InitSeeprom
0 0000ba6f _InitSysCtrl
0 0000a39b _InitXintf16Gpio
0 0000b12b _Init_DAC
0 00009bc6 _Init_packMask
0 00009022 _Init_sensors
0 0000a339 _Init_sensors_more
1 0000dd1e _K100
1 0000dd20 _K_50
1 0000dd22 _K_T1
1 0000dd24 _K_T2
1 0000dff6 _Kalibro
1 0000dff5 _Kurrent
1 0000dc7c _LSPCLK
0 0000b516 _LUF_ISR
0 0000b531 _LVF_ISR
0 0000b098 _Load_control_init
0 0000a9e1 _Load_params
0 0000a2d0 _Load_protection_prepare
0 00008c31 _Load_runner
0 0000aa9a _Load_voltage_can
1 0000dea0 _Log
1 0000e02c _Lonely
0 0000b54c _MRINTA_ISR
0 0000b567 _MRINTB_ISR
1 0000dffa _MUX_GPIO32
1 0000dffb _MUX_GPIO48
0 0000b582 _MXINTA_ISR
0 0000b59d _MXINTB_ISR
1 0000d8f0 _Maska
1 00005000 _McbspaRegs
1 00005040 _McbspbRegs
1 0000e00c _MessageReceivedCount
1 0000e00e _MessageTransivedCount
1 0000dff0 _Mode
0 0000b9a3 _NMI_ISR
1 0000dff7 _Owen
0 0000ba52 _PIE_RESERVED
1 00380090 _PartIdRegs
1 00000ce0 _PieCtrlRegs
1 00000d00 _PieVectTable
0 0000c274 _PieVectTableInit
0 0000948d _Power_count
1 0000dd04 _READY
0 0000b84f _RESET
0 0000a73d _RSA_RX_Handler
0 0000a783 _RSA_TX_Handler
0 0000a7c9 _RSB_RX_Handler
0 0000a80f _RSB_TX_Handler
0 0000abf3 _RS_BSend
0 0000ad8f _RS_FifoTick1ms
0 0000b8e8 _RS_FifoWait
1 0000dec0 _RS_Len
0 00008d8d _RS_RX_Handler
0 0000a5d0 _RS_Send
0 0000b79e _RS_SetBitMode
0 0000ae1a _RS_SetLineMode
0 0000af45 _RS_SetLineSpeed
0 0000a262 _RS_TX_Handler
0 0000b974 _RTOSINT_ISR
0 0000c000 _RamfuncsLoadEnd
0 0000c000 _RamfuncsLoadStart
0 0000c000 _RamfuncsRunStart
0 0000ac2a _ReceiveAnswerModbus4
0 000099f6 _ReceiveCommandModbus3
0 0000a44b _ReceiveCommandModbus6
0 0000b5b8 _SCIRXINTA_ISR
0 0000b5d3 _SCIRXINTB_ISR
0 0000b5ee _SCIRXINTC_ISR
0 0000b609 _SCITXINTA_ISR
0 0000b624 _SCITXINTB_ISR
0 0000b63f _SCITXINTC_ISR
0 0000b0b6 _SENDBIT
0 0000b65a _SEQ1INT_ISR
0 0000b675 _SEQ2INT_ISR
0 0000b690 _SPIRXINTA_ISR
0 0000ba90 _SPISE2P_DRV_csclr
0 0000ba95 _SPISE2P_DRV_csset
0 0000acfa _SPISE2P_DRV_init
0 0000914b _SPISE2P_DRV_tick
0 0000b6ab _SPITXINTA_ISR
1 0000dc7a _SYSCLKOUT
0 0000af6b _Save_params
1 00007050 _SciaRegs
1 00007750 _ScibRegs
1 00007770 _ScicRegs
0 0000a91e _Seeprom_read
0 0000a95f _Seeprom_write
0 0000ab83 _SendCommandModbus4
0 0000b896 _ServiceDog
0 0000b01a _Setup_DAC_time
1 00007040 _SpiaRegs
1 00007010 _SysCtrlRegs
0 0000b6c6 _TINT0_ISR
1 0000dd05 _TPL_CANS
0 00008437 _Temper_count
1 0000dff2 _TermoAD
1 0000dff3 _TermoRS
1 0000dff4 _TermoSW
1 0000e010 _TestMbox1
1 0000e012 _TestMbox2
1 0000e014 _TestMbox3
0 0000994d _UMP_CAN_service
0 0000b9ae _USER10_ISR
0 0000b9b9 _USER11_ISR
0 0000b9c4 _USER12_ISR
0 0000b9cf _USER1_ISR
0 0000b9da _USER2_ISR
0 0000b9e5 _USER3_ISR
0 0000b9f0 _USER4_ISR
0 0000b9fb _USER5_ISR
0 0000ba06 _USER6_ISR
0 0000ba11 _USER7_ISR
0 0000ba1c _USER8_ISR
0 0000ba27 _USER9_ISR
1 0000dfbc _WAKE
0 0000b6e1 _WAKEINT_ISR
1 0000dfbe _WAKE_TIME
1 0000deb8 _WAKEpowse
0 0000b7eb _XINT1_ISR
0 0000b804 _XINT2_ISR
0 0000b6fc _XINT3_ISR
0 0000b717 _XINT4_ISR
0 0000b732 _XINT5_ISR
0 0000b74d _XINT6_ISR
0 0000b768 _XINT7_ISR
1 00007070 _XIntruptRegs
1 00000b20 _XintfRegs
1 000007f0 __STACK_END
abs 000003f0 __STACK_SIZE
abs ffffffff ___TI_pprof_out_hndl
abs ffffffff ___TI_prof_data_size
abs ffffffff ___TI_prof_data_start
abs ffffffff ___binit__
abs ffffffff ___c_args__
0 0000c000 ___cinit__
0 0000baa7 ___etext__
abs ffffffff ___pinit__
0 00008000 ___text__
0 0000b783 __args_main
1 0000e054 __cleanup_ptr
1 0000e056 __dtors_ptr
1 0000de3e __lock
0 0000ba80 __nop
0 0000ba7c __register_lock
0 0000ba78 __register_unlock
1 00000400 __stack
1 0000de3c __unlock
0 0000b81d _abort
1 0000d740 _adc_filter
0 0000825a _adc_isr
1 0000d73c _adc_table_lem
0 0000a855 _c_int00
1 0000dd07 _cal_addr
0 000097f3 _calc_sensor_koef
1 0000df80 _ccc
1 0000dd0b _chk
0 0000b87f _clear_mem
1 0000ddbe _cntr_addr_c
1 0000ddbf _cntr_addr_c_all
0 00008edf _cpu_timer1_isr_PULT
0 00008aad _cpu_timer1_isr_SENS
0 0000ab4a _cpu_timer2_isr
1 0000dac0 _crc_16_tab
0 0000b7b8 _create_uart_vars
0 0000ad5e _dSEND
1 0000dd28 _def_FILTERBAT
1 0000df40 _def_cal
1 0000dab0 _digits
1 0000d70a _din_count
0 0000b981 _epilog_c28x_1
0 0000b985 _epilog_c28x_2
0 0000b8c0 _er_anal
1 0000dd3a _err_count
1 0000e053 _errno
0 0000b81f _exit
1 0000e02e _ext_diag
1 0000e036 _ext_temp
0 00009f0d _extendbios
0 0000adbe _filterbat
1 0000dc41 _flag_DEBUG
1 0000de8a _flog
0 000085de _get_Buttons
0 0000926d _get_Mode
0 0000a3f4 _get_command
0 0000af1e _get_crc16
0 0000b90e _get_crc_16
0 0000ae74 _get_crc_16b
0 0000b147 _im_calc
0 000099f5 _init
0 0000aa21 _init_zone7
0 0000a6f6 _initload
1 0000e02a _isMask
1 0000e024 _isNumb
0 00009382 _kanal_Send
1 0000e048 _lev_count
1 0000e018 _lev_quadr
0 0000a665 _load
1 00200000 _logs_block
1 0000e05a _low_count
0 00008781 _main
0 0000ba89 _memset
1 0000dbc0 _modbus
1 0000de89 _never_write
1 0000de88 _no_write
1 0000dd13 _okay
1 0000d900 _out_filter
1 0000dc80 _param
0 0000b920 _pause_us
0 0000a097 _peek
1 0000dd0a _period_blink
1 0000dea8 _period_dac
1 0000dd09 _period_ready
0 0000ab10 _poke
1 0000d72a _powK
1 0000dd08 _pow_addr
1 0000df22 _prev_ok
0 0000b836 _prolog_c28x_1
0 0000b83a _prolog_c28x_2
0 0000b842 _prolog_c28x_3
1 0000e025 _quaLamp
1 0000e04e _readr
0 0000b079 _reset_errs
1 0000d040 _rs_a
1 0000d3c0 _rs_b
0 0000ba5c _rsvd_ISR
0 00009f91 _run
0 0000afb3 _select_tpl_255
0 00009a93 _select_tpl_canal
1 0000dc42 _sens_count
1 0000dfc0 _sens_pair
1 0000dfd8 _sens_type
0 0000ba9a _set_cntrl_addr
0 00008920 _setup_adc
0 0000a9a0 _setup_arr_cmd_length
0 0000afd7 _setup_leds_line
0 00009672 _setup_uart
1 0000dd0c _sig
0 0000b03a _sqrt
0 0000baa6 _tflash
1 0000dd0d _time_1_5sec
1 0000dd0f _time_3sec
1 0000dd0e _time_5msec
1 0000dd10 _time_5sec
1 0000dea9 _time_dac
0 0000ae47 _timer_Init
1 0000dd06 _tpl_cans
0 0000aad5 _ump_can_fragment
0 0000b163 _ump_crc
0 0000a89b _ump_log_can
0 0000b0d4 _ump_log_init
0 0000adec _ump_log_io
0 00009740 _ump_log_read
0 0000ba32 _ump_log_rs
0 0000b867 _ump_log_tick
0 0000a1f2 _ump_log_write
0 0000a537 _ump_prepare
0 00009f92 _ump_rtu_encode
0 0000b17f _ump_tms28335_capture
0 0000abbb _ump_tms28335_fragment
0 0000b0f1 _ump_tms28335_prepare
0 0000a181 _ump_validate
0 0000ad2c _unsetup_leds_line
0 00009b2f _upload
1 0000e001 _wait
0 0000b10e _what_is
1 0000e040 _zer_count
1 0000de40 _zer_filter
abs ffffffff binit
0 0000c000 cinit
0 0000baa7 etext
abs ffffffff pinit
GLOBAL SYMBOLS: SORTED BY Symbol Address
page address name
---- ------- ----
0 00008000 .text
0 00008000 ___text__
0 00008000 _reset_errs
0 00008022 _im_calc
0 0000803e _er_anal
0 00008053 _calc_sensor_koef
0 00008111 _Temper_count
0 000082ee _Power_count
0 000083d8 _Init_sensors_more
0 00008438 _Init_sensors
0 000085ae _Init_packMask
0 00008656 _Current_count
0 000088e6 _rsvd_ISR
0 000088f0 _XINT7_ISR
0 0000890b _XINT6_ISR
0 00008926 _XINT5_ISR
0 00008941 _XINT4_ISR
0 0000895c _XINT3_ISR
0 00008977 _XINT2_ISR
0 00008990 _XINT1_ISR
0 000089a9 _WAKEINT_ISR
0 000089c4 _USER9_ISR
0 000089cf _USER8_ISR
0 000089da _USER7_ISR
0 000089e5 _USER6_ISR
0 000089f0 _USER5_ISR
0 000089fb _USER4_ISR
0 00008a06 _USER3_ISR
0 00008a11 _USER2_ISR
0 00008a1c _USER1_ISR
0 00008a27 _USER12_ISR
0 00008a32 _USER11_ISR
0 00008a3d _USER10_ISR
0 00008a48 _TINT0_ISR
0 00008a63 _SPITXINTA_ISR
0 00008a7e _SPIRXINTA_ISR
0 00008a99 _SEQ2INT_ISR
0 00008ab4 _SEQ1INT_ISR
0 00008acf _SCITXINTC_ISR
0 00008aea _SCITXINTB_ISR
0 00008b05 _SCITXINTA_ISR
0 00008b20 _SCIRXINTC_ISR
0 00008b3b _SCIRXINTB_ISR
0 00008b56 _SCIRXINTA_ISR
0 00008b71 _RTOSINT_ISR
0 00008b7e _PIE_RESERVED
0 00008b88 _NMI_ISR
0 00008b93 _MXINTB_ISR
0 00008bae _MXINTA_ISR
0 00008bc9 _MRINTB_ISR
0 00008be4 _MRINTA_ISR
0 00008bff _LVF_ISR
0 00008c1a _LUF_ISR
0 00008c35 _INT_NOTUSED_ISR
0 00008c3f _INT14_ISR
0 00008c4c _INT13_ISR
0 00008c59 _ILLEGAL_ISR
0 00008c64 _I2CINT2A_ISR
0 00008c7f _I2CINT1A_ISR
0 00008c9a _EQEP2_INT_ISR
0 00008cb5 _EQEP1_INT_ISR
0 00008cd0 _EPWM6_TZINT_ISR
0 00008ceb _EPWM6_INT_ISR
0 00008d06 _EPWM5_TZINT_ISR
0 00008d21 _EPWM5_INT_ISR
0 00008d3c _EPWM4_TZINT_ISR
0 00008d57 _EPWM4_INT_ISR
0 00008d72 _EPWM3_TZINT_ISR
0 00008d8d _EPWM3_INT_ISR
0 00008da8 _EPWM2_TZINT_ISR
0 00008dc3 _EPWM2_INT_ISR
0 00008dde _EPWM1_TZINT_ISR
0 00008df9 _EPWM1_INT_ISR
0 00008e14 _EMUINT_ISR
0 00008e1f _ECAP6_INT_ISR
0 00008e3a _ECAP5_INT_ISR
0 00008e55 _ECAP4_INT_ISR
0 00008e70 _ECAP3_INT_ISR
0 00008e8b _ECAP2_INT_ISR
0 00008ea6 _ECAP1_INT_ISR
0 00008ec1 _ECAN1INTB_ISR
0 00008edc _ECAN1INTA_ISR
0 00008ef7 _ECAN0INTB_ISR
0 00008f12 _ECAN0INTA_ISR
0 00008f2d _DINTCH6_ISR
0 00008f48 _DINTCH5_ISR
0 00008f63 _DINTCH4_ISR
0 00008f7e _DINTCH3_ISR
0 00008f99 _DINTCH2_ISR
0 00008fb4 _DINTCH1_ISR
0 00008fcf _DATALOG_ISR
0 00008fdc _ADCINT_ISR
0 00008ff7 _unsetup_leds_line
0 00009029 _setup_leds_line
0 0000904b _select_tpl_canal
0 000090db _select_tpl_255
0 000090ff _get_Mode
0 0000921c _get_Buttons
0 000093ba _test_rs_live
0 000093bb _RS_SetLineMode
0 000093e8 _setup_arr_cmd_length
0 0000942f _RS_SetLineSpeed
0 0000944f _RS_SetBitMode
0 00009469 _setup_uart
0 0000951a _create_uart_vars
0 00009526 _clear_timer_rs_live
0 0000952b _RS_TX_Handler
0 000095a4 _RS_Send
0 000095fc _RS_RX_Handler
0 00009746 _RS_BSend
0 000098a5 _ump_log_write
0 00009920 _ump_log_tick
0 00009944 _ump_log_rs
0 00009982 _ump_log_read
0 00009a30 _ump_log_io
0 00009a5e _ump_log_init
0 00009a92 _ump_log_can
0 00009ae1 _clear_mem
0 00009af6 _SendCommandModbus4
0 00009b1e _Save_params
0 00009bc7 _ReceiveCommandModbus6
0 00009c05 _ReceiveCommandModbus3
0 00009c90 _ReceiveAnswerModbus4
0 00009cba _Default_params
0 00009dd6 _Load_params
0 00009e1e _ump_validate
0 00009e70 _ump_prepare
0 00009ec3 _ump_crc
0 00009ede _ump_rtu_encode
0 00009f69 _ump_rtu_response
0 00009fb2 _ump_tms28335_rtu
0 00009fd3 _ump_tms28335_prepare
0 00009ff0 _ump_can_fragment
0 0000a028 _ump_tms28335_fragment
0 0000a063 _ump_tms28335_capture
0 0000a083 _ump_rtu
0 0000a0c8 _ump_can_request
0 0000a110 _ump_can_id
0 0000a124 _xflash
0 0000a125 _write_memory
0 0000a128 _upload
0 0000a1ad _tflash
0 0000a1ae _run
0 0000a1af _read_memory
0 0000a1b2 _Answer
0 0000a1da _poke
0 0000a216 _peek
0 0000a28f _load
0 0000a2d7 _initload
0 0000a31a _init
0 0000a31b _get_command
0 0000a373 _extendbios
0 0000a3e3 _spiSe2pWrite
0 0000a3e7 _spiSe2pRead
0 0000a3eb _spiSe2pFree
0 0000a3f2 _SPISE2P_DRV_csclr
0 0000a3f7 _SPISE2P_DRV_csset
0 0000a3fc _SPISE2P_DRV_init
0 0000a42e _SPISE2P_DRV_tick
0 0000a58f _Seeprom_write
0 0000a5d2 _Seeprom_read
0 0000a615 _InitSeeprom
0 0000a63e _timer_Init
0 0000a66b _main
0 0000a88b _UMP_CAN_service
0 0000a920 _InitCan
0 0000a9d9 _Handlai
0 0000aa38 _CAN_send
0 0000aa84 _adc_isr
0 0000ac77 _cpu_timer1_isr_SENS
0 0000ae3c _setup_adc
0 0000afd2 _wast
0 0000afd7 _dOUT
0 0000afe3 _dSEND
0 0000b011 _Setup_DAC_time
0 0000b01b _Anal_output
0 0000b064 _Init_DAC
0 0000b080 _Load_runner
0 0000b15c _DOUT
0 0000b168 _DCLK
0 0000b174 _SENDBIT
0 0000b186 _RESET
0 0000b199 _kanal_Send
0 0000b2c8 _ServiceDog
0 0000b2de _DisableDog
0 0000b2e6 _InitPll
0 0000b368 _InitPeripheralClocks
0 0000b3ed _InitSysCtrl
0 0000b3f6 _CsmUnlock
0 0000b425 _cpu_timer1_isr_PULT
0 0000b576 _RSB_TX_Handler
0 0000b5bb _RSB_RX_Handler
0 0000b600 _RSA_TX_Handler
0 0000b645 _RSA_RX_Handler
0 0000b68a _InitXintf16Gpio
0 0000b6e3 _InitXintf32Gpio
0 0000b733 _InitXintf
0 0000b796 FS$$DIV
0 0000b81e _get_crc_16b
0 0000b848 _get_crc_16
0 0000b859 _get_crc16
0 0000b893 _CANa_reset_err
0 0000b8be _CANa_handler
0 0000b908 _InitCpuTimers
0 0000b947 _ConfigCpuTimer
0 0000b966 _pause_us
0 0000b977 _init_zone7
0 0000b9b5 _c_int00
0 0000b9fb _cpu_timer2_isr
0 0000ba34 _filterbat
0 0000ba6b L$$DIV
0 0000ba7a L$$MOD
0 0000ba88 UL$$DIV
0 0000ba8f UL$$MOD
0 0000ba95 _InitPieCtrl
0 0000bab4 _EnableInterrupts
0 0000babe _sqrt
0 0000bade _what_is
0 0000bafb __args_main
0 0000bb16 _InitAdc
0 0000bb2f C$$EXIT
0 0000bb2f _abort
0 0000bb31 _exit
0 0000bb48 _InitPieVectTable
0 0000bb56 U$$DIV
0 0000bb5b U$$MOD
0 0000bb61 __register_unlock
0 0000bb65 __register_lock
0 0000bb69 __nop
0 0000bb6a _set_cntrl_addr
0 0000bb6f _DSP28x_usDelay
0 0000bb73 ___etext__
0 0000bb73 etext
0 0000c000 _RamfuncsLoadEnd
0 0000c000 _RamfuncsLoadStart
0 0000c000 _RamfuncsRunStart
0 0000c000 ___cinit__
0 0000c000 cinit
0 0000c28c _PieVectTableInit
0 0000c3ae _ADDR_ANSWER
0 0000c3af _ADDR_TERMINAL
0 0000c3b0 _CNTRL_ADDR_UNIVERSAL
0 00380080 _ADC_cal
1 00000400 __stack
1 000007f0 __STACK_END
1 00000880 _DevEmuRegs
1 00000a80 _FlashRegs
1 00000ae0 _CsmRegs
1 00000b00 _AdcMirror
1 00000b20 _XintfRegs
1 00000c00 _CpuTimer0Regs
1 00000c08 _CpuTimer1Regs
1 00000c10 _CpuTimer2Regs
1 00000ce0 _PieCtrlRegs
1 00000d00 _PieVectTable
1 00001000 _DmaRegs
1 00005000 _McbspaRegs
1 00005040 _McbspbRegs
1 00006000 _ECanaRegs
1 00006040 _ECanaLAMRegs
1 00006080 _ECanaMOTSRegs
1 000060c0 _ECanaMOTORegs
1 00006100 _ECanaMboxes
1 00006200 _ECanbRegs
1 00006240 _ECanbLAMRegs
1 00006280 _ECanbMOTSRegs
1 000062c0 _ECanbMOTORegs
1 00006300 _ECanbMboxes
1 00006800 _EPwm1Regs
1 00006840 _EPwm2Regs
1 00006880 _EPwm3Regs
1 000068c0 _EPwm4Regs
1 00006900 _EPwm5Regs
1 00006940 _EPwm6Regs
1 00006a00 _ECap1Regs
1 00006a20 _ECap2Regs
1 00006a40 _ECap3Regs
1 00006a60 _ECap4Regs
1 00006a80 _ECap5Regs
1 00006aa0 _ECap6Regs
1 00006b00 _EQep1Regs
1 00006b40 _EQep2Regs
1 00006f80 _GpioCtrlRegs
1 00006fc0 _GpioDataRegs
1 00006fe0 _GpioIntRegs
1 00007010 _SysCtrlRegs
1 00007040 _SpiaRegs
1 00007050 _SciaRegs
1 00007070 _XIntruptRegs
1 00007100 _AdcRegs
1 00007750 _ScibRegs
1 00007770 _ScicRegs
1 00007900 _I2caRegs
1 0000d040 _rs_a
1 0000d3c0 _rs_b
1 0000d704 _sens_count
1 0000d73c _adc_table_lem
1 0000d740 _adc_filter
1 0000d8f0 _Maska
1 0000d900 _out_filter
1 0000dab0 _digits
1 0000dac0 _crc_16_tab
1 0000dbc0 _modbus
1 0000dc41 _flag_DEBUG
1 0000dc42 _CanPowse
1 0000dc43 _CanGO
1 0000dc44 _READY
1 0000dc45 _TPL_CANS
1 0000dc46 _tpl_cans
1 0000dc47 _cal_addr
1 0000dc48 _pow_addr
1 0000dc49 _period_ready
1 0000dc4a _period_blink
1 0000dc4b _chk
1 0000dc4c _sig
1 0000dc4d _time_1_5sec
1 0000dc4e _time_5msec
1 0000dc4f _time_3sec
1 0000dc50 _time_5sec
1 0000dc51 _Caliber_time
1 0000dc52 _Curr_Edge
1 0000dc53 _okay
1 0000dc5e _K100
1 0000dc60 _K_50
1 0000dc62 _K_T1
1 0000dc64 _K_T2
1 0000dc68 _def_FILTERBAT
1 0000dc7a _SYSCLKOUT
1 0000dc7c _LSPCLK
1 0000dc7e _HSPCLK
1 0000dc80 _param
1 0000dd01 _errno
1 0000dd02 _no_write
1 0000dd03 _never_write
1 0000dd04 _flog
1 0000dd18 _ump_dac_ramp
1 0000dd19 _ump_dac_duration
1 0000dd1a _ump_dac_go10
1 0000dd1b _ump_dac_stop10
1 0000dd1c _ump_dac_position
1 0000dd22 _Log
1 0000dd2a _powK
1 0000dd3c _ADDR_FOR_ALL
1 0000dd3d _CNTRL_ADDR
1 0000dd3e _cntr_addr_c
1 0000dd3f _cntr_addr_c_all
1 0000ddbc __unlock
1 0000ddbe __lock
1 0000ddc0 _zer_filter
1 0000de08 _din_count
1 0000de28 _CpuTimer0
1 0000de30 _CpuTimer1
1 0000de38 _CpuTimer2
1 0000de40 _RS_Len
1 0000de86 _ADC_table
1 0000dea2 _prev_ok
1 0000dec0 _def_cal
1 0000df00 _ccc
1 0000df1c _sens_pair
1 0000df34 _COUNT_ONE_CANAL
1 0000df35 _COUNT_DISCHARGE
1 0000df36 _COUNT_TRANSICIA
1 0000df37 _FILTER_CLIP
1 0000df3c _WAKE
1 0000df3e _WAKE_TIME
1 0000df40 _sens_type
1 0000df58 _CanTimeOutErrorTR
1 0000df59 _wait
1 0000df62 _ErrorCount
1 0000df64 _MessageReceivedCount
1 0000df66 _MessageTransivedCount
1 0000df68 _TestMbox1
1 0000df6a _TestMbox2
1 0000df6c _TestMbox3
1 0000df70 _Mode
1 0000df71 _Desk
1 0000df72 _TermoAD
1 0000df73 _TermoRS
1 0000df74 _TermoSW
1 0000df75 _Kurrent
1 0000df76 _Kalibro
1 0000df77 _Owen
1 0000df78 _INcount0
1 0000df79 _INcount1
1 0000df7a _MUX_GPIO32
1 0000df7b _MUX_GPIO48
1 0000df7c _DIR_GPIO32
1 0000df7d _DIR_GPIO48
1 0000df7e _DigErr
1 0000df80 _period_dac
1 0000df81 _time_dac
1 0000df86 _WAKEpowse
1 0000df88 _IMPowse
1 0000df8e _lev_quadr
1 0000df9a _isNumb
1 0000df9b _quaLamp
1 0000dfa0 _isMask
1 0000dfa2 _Lonely
1 0000dfa4 _ext_diag
1 0000dfac _ext_temp
1 0000dfb4 _zer_count
1 0000dfbc __cleanup_ptr
1 0000dfbe __dtors_ptr
1 0000dfc0 _err_count
1 0000dfc6 _lev_count
1 0000dfcc _readr
1 0000dfdb _low_count
1 00200000 _logs_block
1 0033fff8 _CsmPwl
1 00380090 _PartIdRegs
abs 000003f0 __STACK_SIZE
abs ffffffff ___TI_pprof_out_hndl
abs ffffffff ___TI_prof_data_size
abs ffffffff ___TI_prof_data_start
abs ffffffff ___binit__
abs ffffffff ___c_args__
abs ffffffff ___pinit__
abs ffffffff binit
abs ffffffff pinit
page address name
---- ------- ----
0 00008000 .text
0 00008000 _Current_count
0 00008000 ___text__
0 0000825a _adc_isr
0 00008437 _Temper_count
0 000085de _get_Buttons
0 00008781 _main
0 00008920 _setup_adc
0 00008aad _cpu_timer1_isr_SENS
0 00008c31 _Load_runner
0 00008d8d _RS_RX_Handler
0 00008edf _cpu_timer1_isr_PULT
0 00009022 _Init_sensors
0 0000914b _SPISE2P_DRV_tick
0 0000926d _get_Mode
0 00009382 _kanal_Send
0 0000948d _Power_count
0 00009586 _Default_params
0 00009672 _setup_uart
0 00009740 _ump_log_read
0 000097f3 _calc_sensor_koef
0 000098a1 _InitCan
0 0000994d _UMP_CAN_service
0 000099f5 _init
0 000099f6 _ReceiveCommandModbus3
0 00009a93 _select_tpl_canal
0 00009b2f _upload
0 00009bc6 _Init_packMask
0 00009e00 FS$$DIV
0 00009e88 _InitPeripheralClocks
0 00009f0d _extendbios
0 00009f91 _run
0 00009f92 _ump_rtu_encode
0 0000a015 _InitPll
0 0000a097 _peek
0 0000a10f _Handlai
0 0000a181 _ump_validate
0 0000a1f2 _ump_log_write
0 0000a262 _RS_TX_Handler
0 0000a2d0 _Load_protection_prepare
0 0000a339 _Init_sensors_more
0 0000a39b _InitXintf16Gpio
0 0000a3f4 _get_command
0 0000a44b _ReceiveCommandModbus6
0 0000a537 _ump_prepare
0 0000a5d0 _RS_Send
0 0000a61b _CANa_handler
0 0000a665 _load
0 0000a6ae _CAN_send
0 0000a6f6 _initload
0 0000a73d _RSA_RX_Handler
0 0000a783 _RSA_TX_Handler
0 0000a7c9 _RSB_RX_Handler
0 0000a80f _RSB_TX_Handler
0 0000a855 _c_int00
0 0000a89b _ump_log_can
0 0000a91e _Seeprom_read
0 0000a95f _Seeprom_write
0 0000a9a0 _setup_arr_cmd_length
0 0000a9e1 _Load_params
0 0000aa21 _init_zone7
0 0000aa5f _InitCpuTimers
0 0000aa9a _Load_voltage_can
0 0000aad5 _ump_can_fragment
0 0000ab10 _poke
0 0000ab4a _cpu_timer2_isr
0 0000ab83 _SendCommandModbus4
0 0000abbb _ump_tms28335_fragment
0 0000abf3 _RS_BSend
0 0000ac2a _ReceiveAnswerModbus4
0 0000ac61 _Answer
0 0000acfa _SPISE2P_DRV_init
0 0000ad2c _unsetup_leds_line
0 0000ad5e _dSEND
0 0000ad8f _RS_FifoTick1ms
0 0000adbe _filterbat
0 0000adec _ump_log_io
0 0000ae1a _RS_SetLineMode
0 0000ae47 _timer_Init
0 0000ae74 _get_crc_16b
0 0000aea0 _CANa_reset_err
0 0000aecb L$$DIV
0 0000aeda L$$MOD
0 0000aee8 UL$$DIV
0 0000aeef UL$$MOD
0 0000aef5 _InitSeeprom
0 0000af1e _get_crc16
0 0000af45 _RS_SetLineSpeed
0 0000af6b _Save_params
0 0000afb3 _select_tpl_255
0 0000afd7 _setup_leds_line
0 0000aff9 _ConfigCpuTimer
0 0000b01a _Setup_DAC_time
0 0000b03a _sqrt
0 0000b05a _InitPieCtrl
0 0000b079 _reset_errs
0 0000b098 _Load_control_init
0 0000b0b6 _SENDBIT
0 0000b0d4 _ump_log_init
0 0000b0f1 _ump_tms28335_prepare
0 0000b10e _what_is
0 0000b12b _Init_DAC
0 0000b147 _im_calc
0 0000b163 _ump_crc
0 0000b17f _ump_tms28335_capture
0 0000b19b _ADCINT_ISR
0 0000b1b6 _DINTCH1_ISR
0 0000b1d1 _DINTCH2_ISR
0 0000b1ec _DINTCH3_ISR
0 0000b207 _DINTCH4_ISR
0 0000b222 _DINTCH5_ISR
0 0000b23d _DINTCH6_ISR
0 0000b258 _ECAN0INTA_ISR
0 0000b273 _ECAN0INTB_ISR
0 0000b28e _ECAN1INTA_ISR
0 0000b2a9 _ECAN1INTB_ISR
0 0000b2c4 _ECAP1_INT_ISR
0 0000b2df _ECAP2_INT_ISR
0 0000b2fa _ECAP3_INT_ISR
0 0000b315 _ECAP4_INT_ISR
0 0000b330 _ECAP5_INT_ISR
0 0000b34b _ECAP6_INT_ISR
0 0000b366 _EPWM1_INT_ISR
0 0000b381 _EPWM1_TZINT_ISR
0 0000b39c _EPWM2_INT_ISR
0 0000b3b7 _EPWM2_TZINT_ISR
0 0000b3d2 _EPWM3_INT_ISR
0 0000b3ed _EPWM3_TZINT_ISR
0 0000b408 _EPWM4_INT_ISR
0 0000b423 _EPWM4_TZINT_ISR
0 0000b43e _EPWM5_INT_ISR
0 0000b459 _EPWM5_TZINT_ISR
0 0000b474 _EPWM6_INT_ISR
0 0000b48f _EPWM6_TZINT_ISR
0 0000b4aa _EQEP1_INT_ISR
0 0000b4c5 _EQEP2_INT_ISR
0 0000b4e0 _I2CINT1A_ISR
0 0000b4fb _I2CINT2A_ISR
0 0000b516 _LUF_ISR
0 0000b531 _LVF_ISR
0 0000b54c _MRINTA_ISR
0 0000b567 _MRINTB_ISR
0 0000b582 _MXINTA_ISR
0 0000b59d _MXINTB_ISR
0 0000b5b8 _SCIRXINTA_ISR
0 0000b5d3 _SCIRXINTB_ISR
0 0000b5ee _SCIRXINTC_ISR
0 0000b609 _SCITXINTA_ISR
0 0000b624 _SCITXINTB_ISR
0 0000b63f _SCITXINTC_ISR
0 0000b65a _SEQ1INT_ISR
0 0000b675 _SEQ2INT_ISR
0 0000b690 _SPIRXINTA_ISR
0 0000b6ab _SPITXINTA_ISR
0 0000b6c6 _TINT0_ISR
0 0000b6e1 _WAKEINT_ISR
0 0000b6fc _XINT3_ISR
0 0000b717 _XINT4_ISR
0 0000b732 _XINT5_ISR
0 0000b74d _XINT6_ISR
0 0000b768 _XINT7_ISR
0 0000b783 __args_main
0 0000b79e _RS_SetBitMode
0 0000b7b8 _create_uart_vars
0 0000b7d2 _InitAdc
0 0000b7eb _XINT1_ISR
0 0000b804 _XINT2_ISR
0 0000b81d C$$EXIT
0 0000b81d _abort
0 0000b81f _exit
0 0000b836 _prolog_c28x_1
0 0000b83a _prolog_c28x_2
0 0000b842 _prolog_c28x_3
0 0000b84f _RESET
0 0000b867 _ump_log_tick
0 0000b87f _clear_mem
0 0000b896 _ServiceDog
0 0000b8c0 _er_anal
0 0000b8e8 _RS_FifoWait
0 0000b90e _get_crc_16
0 0000b920 _pause_us
0 0000b940 _DATALOG_ISR
0 0000b94d _INT13_ISR
0 0000b95a _INT14_ISR
0 0000b967 _InitPieVectTable
0 0000b974 _RTOSINT_ISR
0 0000b981 _epilog_c28x_1
0 0000b985 _epilog_c28x_2
0 0000b98d _EMUINT_ISR
0 0000b998 _ILLEGAL_ISR
0 0000b9a3 _NMI_ISR
0 0000b9ae _USER10_ISR
0 0000b9b9 _USER11_ISR
0 0000b9c4 _USER12_ISR
0 0000b9cf _USER1_ISR
0 0000b9da _USER2_ISR
0 0000b9e5 _USER3_ISR
0 0000b9f0 _USER4_ISR
0 0000b9fb _USER5_ISR
0 0000ba06 _USER6_ISR
0 0000ba11 _USER7_ISR
0 0000ba1c _USER8_ISR
0 0000ba27 _USER9_ISR
0 0000ba32 _ump_log_rs
0 0000ba3d U$$DIV
0 0000ba42 U$$MOD
0 0000ba48 _INT_NOTUSED_ISR
0 0000ba52 _PIE_RESERVED
0 0000ba5c _rsvd_ISR
0 0000ba66 _EnableInterrupts
0 0000ba6f _InitSysCtrl
0 0000ba78 __register_unlock
0 0000ba7c __register_lock
0 0000ba80 __nop
0 0000ba81 _DisableDog
0 0000ba89 _memset
0 0000ba90 _SPISE2P_DRV_csclr
0 0000ba95 _SPISE2P_DRV_csset
0 0000ba9a _set_cntrl_addr
0 0000ba9f _DSP28x_usDelay
0 0000baa6 _tflash
0 0000baa7 ___etext__
0 0000baa7 etext
0 0000c000 _RamfuncsLoadEnd
0 0000c000 _RamfuncsLoadStart
0 0000c000 _RamfuncsRunStart
0 0000c000 ___cinit__
0 0000c000 cinit
0 0000c274 _PieVectTableInit
0 0000c39c _ADDR_ANSWER
0 0000c39d _ADDR_TERMINAL
0 0000c39e _CNTRL_ADDR_UNIVERSAL
0 00380080 _ADC_cal
1 00000400 __stack
1 000007f0 __STACK_END
1 00000880 _DevEmuRegs
1 00000a80 _FlashRegs
1 00000ae0 _CsmRegs
1 00000b00 _AdcMirror
1 00000b20 _XintfRegs
1 00000c00 _CpuTimer0Regs
1 00000c08 _CpuTimer1Regs
1 00000c10 _CpuTimer2Regs
1 00000ce0 _PieCtrlRegs
1 00000d00 _PieVectTable
1 00001000 _DmaRegs
1 00005000 _McbspaRegs
1 00005040 _McbspbRegs
1 00006000 _ECanaRegs
1 00006040 _ECanaLAMRegs
1 00006080 _ECanaMOTSRegs
1 000060c0 _ECanaMOTORegs
1 00006100 _ECanaMboxes
1 00006200 _ECanbRegs
1 00006240 _ECanbLAMRegs
1 00006280 _ECanbMOTSRegs
1 000062c0 _ECanbMOTORegs
1 00006300 _ECanbMboxes
1 00006800 _EPwm1Regs
1 00006840 _EPwm2Regs
1 00006880 _EPwm3Regs
1 000068c0 _EPwm4Regs
1 00006900 _EPwm5Regs
1 00006940 _EPwm6Regs
1 00006a00 _ECap1Regs
1 00006a20 _ECap2Regs
1 00006a40 _ECap3Regs
1 00006a60 _ECap4Regs
1 00006a80 _ECap5Regs
1 00006aa0 _ECap6Regs
1 00006b00 _EQep1Regs
1 00006b40 _EQep2Regs
1 00006f80 _GpioCtrlRegs
1 00006fc0 _GpioDataRegs
1 00006fe0 _GpioIntRegs
1 00007010 _SysCtrlRegs
1 00007040 _SpiaRegs
1 00007050 _SciaRegs
1 00007070 _XIntruptRegs
1 00007100 _AdcRegs
1 00007750 _ScibRegs
1 00007770 _ScicRegs
1 00007900 _I2caRegs
1 0000d040 _rs_a
1 0000d3c0 _rs_b
1 0000d70a _din_count
1 0000d72a _powK
1 0000d73c _adc_table_lem
1 0000d740 _adc_filter
1 0000d8f0 _Maska
1 0000d900 _out_filter
1 0000dab0 _digits
1 0000dac0 _crc_16_tab
1 0000dbc0 _modbus
1 0000dc41 _flag_DEBUG
1 0000dc42 _sens_count
1 0000dc7a _SYSCLKOUT
1 0000dc7c _LSPCLK
1 0000dc7e _HSPCLK
1 0000dc80 _param
1 0000dd02 _CanPowse
1 0000dd03 _CanGO
1 0000dd04 _READY
1 0000dd05 _TPL_CANS
1 0000dd06 _tpl_cans
1 0000dd07 _cal_addr
1 0000dd08 _pow_addr
1 0000dd09 _period_ready
1 0000dd0a _period_blink
1 0000dd0b _chk
1 0000dd0c _sig
1 0000dd0d _time_1_5sec
1 0000dd0e _time_5msec
1 0000dd0f _time_3sec
1 0000dd10 _time_5sec
1 0000dd11 _Caliber_time
1 0000dd12 _Curr_Edge
1 0000dd13 _okay
1 0000dd1e _K100
1 0000dd20 _K_50
1 0000dd22 _K_T1
1 0000dd24 _K_T2
1 0000dd28 _def_FILTERBAT
1 0000dd3a _err_count
1 0000ddbc _ADDR_FOR_ALL
1 0000ddbd _CNTRL_ADDR
1 0000ddbe _cntr_addr_c
1 0000ddbf _cntr_addr_c_all
1 0000de3c __unlock
1 0000de3e __lock
1 0000de40 _zer_filter
1 0000de88 _no_write
1 0000de89 _never_write
1 0000de8a _flog
1 0000dea0 _Log
1 0000dea8 _period_dac
1 0000dea9 _time_dac
1 0000deb8 _WAKEpowse
1 0000deba _IMPowse
1 0000dec0 _RS_Len
1 0000df06 _ADC_table
1 0000df22 _prev_ok
1 0000df40 _def_cal
1 0000df80 _ccc
1 0000df9c _CpuTimer0
1 0000dfa4 _CpuTimer1
1 0000dfac _CpuTimer2
1 0000dfb4 _COUNT_ONE_CANAL
1 0000dfb5 _COUNT_DISCHARGE
1 0000dfb6 _COUNT_TRANSICIA
1 0000dfb7 _FILTER_CLIP
1 0000dfbc _WAKE
1 0000dfbe _WAKE_TIME
1 0000dfc0 _sens_pair
1 0000dfd8 _sens_type
1 0000dff0 _Mode
1 0000dff1 _Desk
1 0000dff2 _TermoAD
1 0000dff3 _TermoRS
1 0000dff4 _TermoSW
1 0000dff5 _Kurrent
1 0000dff6 _Kalibro
1 0000dff7 _Owen
1 0000dff8 _INcount0
1 0000dff9 _INcount1
1 0000dffa _MUX_GPIO32
1 0000dffb _MUX_GPIO48
1 0000dffc _DIR_GPIO32
1 0000dffd _DIR_GPIO48
1 0000dffe _DigErr
1 0000e000 _CanTimeOutErrorTR
1 0000e001 _wait
1 0000e00a _ErrorCount
1 0000e00c _MessageReceivedCount
1 0000e00e _MessageTransivedCount
1 0000e010 _TestMbox1
1 0000e012 _TestMbox2
1 0000e014 _TestMbox3
1 0000e018 _lev_quadr
1 0000e024 _isNumb
1 0000e025 _quaLamp
1 0000e02a _isMask
1 0000e02c _Lonely
1 0000e02e _ext_diag
1 0000e036 _ext_temp
1 0000e040 _zer_count
1 0000e048 _lev_count
1 0000e04e _readr
1 0000e053 _errno
1 0000e054 __cleanup_ptr
1 0000e056 __dtors_ptr
1 0000e05a _low_count
1 00200000 _logs_block
1 0033fff8 _CsmPwl
1 00380090 _PartIdRegs
abs 000003f0 __STACK_SIZE
abs 00003f7e _EEPROM_PARAMS_START_WORD
abs 00007efc _EEPROM_FIRMWARE_LIMIT_BYTES
abs 00007efc _EEPROM_PARAMS_START_BYTE
abs 00007ffe _EEPROM_PARAMS_END_BYTE
abs 00008000 _EEPROM_TOTAL_BYTES
abs ffffffff ___TI_pprof_out_hndl
abs ffffffff ___TI_prof_data_size
abs ffffffff ___TI_prof_data_start
abs ffffffff ___binit__
abs ffffffff ___c_args__
abs ffffffff ___pinit__
abs ffffffff binit
abs ffffffff pinit
[419 symbols]
[409 symbols]

View File

@@ -76,8 +76,8 @@
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.SILICON_VERSION.750562333" name="Processor version (--silicon_version, -v)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.SILICON_VERSION" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.SILICON_VERSION.28" valueType="enumerated"/>
<!-- Настройка option: name=Specify floating point support (- -float_support), superClass=com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.FLOAT_SUPPORT, value=com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.FLOAT_SUPPORT.fpu32. -->
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.FLOAT_SUPPORT.1723304888" name="Specify floating point support (--float_support)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.FLOAT_SUPPORT" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.FLOAT_SUPPORT.fpu32" valueType="enumerated"/>
<!-- Настройка option: name=Optimization level (- -opt_level, -O), superClass=com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_LEVEL, value=com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_LEVEL.2. -->
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_LEVEL.1217592973" name="Optimization level (--opt_level, -O)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_LEVEL" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_LEVEL.2" valueType="enumerated"/>
<!-- Уровень оптимизации 3 согласует Debug с Release и уменьшает загрузочный образ до границы AT25256B; приоритет размера задаётся существующим opt_for_speed=0. -->
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_LEVEL.1217592973" name="Optimization level (--opt_level, -O)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_LEVEL" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_LEVEL.3" valueType="enumerated"/>
<!-- Настройка option: name=Place each function in a separate subsection (- -gen_func_subsections, -mo), superClass=com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.GEN_FUNC_SUBSECTIONS, value=com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.GEN_FUNC_SUBSECTIONS.on. -->
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.GEN_FUNC_SUBSECTIONS.eeprom.40" name="Place each function in a separate subsection (--gen_func_subsections, -mo)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.GEN_FUNC_SUBSECTIONS" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.GEN_FUNC_SUBSECTIONS.on" valueType="enumerated"/>
<!-- Настройка option: name=Speed vs. size trade-offs (- -opt_for_speed, -mf), superClass=com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_FOR_SPEED, value=com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_FOR_SPEED.0. -->
@@ -495,6 +495,8 @@
<!-- Настройка option: name=Optimization level (- -opt_level, -O), superClass=com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_LEVEL.release, value=com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_LEVEL.3. -->
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_LEVEL.release.1938236953" name="Optimization level (--opt_level, -O)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_LEVEL.release" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_LEVEL.3" valueType="enumerated"/>
<!-- Настройка option: superClass=com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.GEN_FUNC_SUBSECTIONS, value=com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.GEN_FUNC_SUBSECTIONS.on. -->
<!-- Приоритет размера 0 в Release совпадает с Debug и проверенной сборкой; загрузочный образ не должен занимать область параметров AT25256B. -->
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_FOR_SPEED.eeprom.release.167" name="Speed vs. size trade-offs (--opt_for_speed, -mf)" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_FOR_SPEED" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.OPT_FOR_SPEED.0" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.GEN_FUNC_SUBSECTIONS.eeprom.194" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.GEN_FUNC_SUBSECTIONS" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.GEN_FUNC_SUBSECTIONS.on" valueType="enumerated"/>
<!-- Настройка option: name=Mode, superClass=com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DIRECTORY_MODE, value=com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DIRECTORY_MODE.manual. -->
<option id="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DIRECTORY_MODE.416134349" name="Mode" superClass="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DIRECTORY_MODE" useByScannerDiscovery="false" value="com.ti.ccstudio.buildDefinitions.C2000_22.6.compilerID.DIRECTORY_MODE.manual" valueType="enumerated"/>

View File

@@ -20,6 +20,10 @@ Debug и Release вызывают prepare_identity.py. Он читает ном
## Зависимости и настройки CCS
Для текущих конфигураций нужны Python, Git и TI C2000 22.6 LTS.
Debug и Release используют оптимизацию уровня 3 и приоритет размера
`--opt_for_speed=0`: это необходимо для размещения образа с настраиваемым
лимитом попыток в AT25256B. Проверенная локальная сборка находится в
`Bin/AttemptLimit`; перед загрузкой применяется SCI8-проверка границы EEPROM.
Общая реализация УМП и порт TMS320F28335 подключаются из
../newProject/SETGUI/third_party/templates/c/set-protocol относительно корня
репозитория. shared_ump.c включает эту реализацию и модуль паспорта.

View File

@@ -153,7 +153,7 @@ def audit(path, text):
continue
# Задаёт count + по выражению справа; значение используется последующими операциями.
count += 1
# Проверяет условие if RUSSIAN.search(lines[i]) or (i and RUSSIAN.search(lines[i-1])) перед выполнением следующего блока.
# Эвристика ищет кириллицу в самой строке или перед ней; русский строковый литерал тоже может дать совпадение. Это проверка наличия текста рядом, а не качества и достоверности комментария.
if RUSSIAN.search(lines[i]) or (i and RUSSIAN.search(lines[i-1])):
# Продолжает текущий вызов, список или выражение: continue; порядок аргументов сохраняется.
continue
@@ -225,10 +225,14 @@ def main():
"",
# Продолжает текущий вызов, список или выражение: "Проверка относится к редактируемым исходникам C/H, ASM, CMD, тестовым INC и Python.",; порядок аргументов сохраняется.
"Проверка относится к редактируемым исходникам C/H, ASM, CMD, тестовым INC и Python.",
# Продолжает текущий вызов, список или выражение: "Каждая непустая строка кода имеет русское пояснение перед ней или на ней. Пустые строки,",; порядок аргументов сохраняется.
"Каждая непустая строка кода имеет русское пояснение перед ней или на ней. Пустые строки,",
# Продолжает текущий вызов, список или выражение: "текст существующих комментариев и содержимое многострочных строк данных не считаются кодом.",; порядок аргументов сохраняется.
"текст существующих комментариев и содержимое многострочных строк данных не считаются кодом.",
# Описывает фактический критерий покрытия, не выдавая наличие кириллицы за оценку качества пояснения.
"Для каждой непустой строки кода проверяется русский текст на ней или непосредственно перед ней.",
# Уточняет исключения счётчика, чтобы комментарии и многострочные данные не завышали объём кода.
"Пустые строки, текст комментариев и содержимое многострочных строк данных не считаются кодом.",
# Предупреждает о главном ограничении: шаблонный текст или русский строковый литерал тоже проходит эвристику.
"Качество и достоверность пояснений этой проверкой не устанавливаются; совпадение возможно и в строковом литерале.",
# Отделяет исходники репозитория от подключаемого и генерируемого кода, отсутствующего в Git-индексе.
"Охват: исходники из Git-индекса. Сгенерированные файлы и подключённые соседние библиотеки проверяются отдельно.",
# Продолжает текущий вызов, список или выражение: "Исходные уведомления TI сохранены. JSON-паспорта, индексы IDE, таблицы XLS и двоичные",; порядок аргументов сохраняется.
"Исходные уведомления TI сохранены. JSON-паспорта, индексы IDE, таблицы XLS и двоичные",
# Продолжает текущий вызов, список или выражение: "результаты сборки не допускают исходных комментариев; их назначение описано в документации.",; порядок аргументов сохраняется.
@@ -239,8 +243,8 @@ def main():
f"UTF-8 проверен в {checked} текстовых файлах. Строк кода: {sum(r[1] for r in rows)}.",
# Продолжает текущий вызов, список или выражение: "",; порядок аргументов сохраняется.
"",
# Продолжает текущий вызов, список или выражение: "| Файл | Строк кода | С русским пояснением |",; порядок аргументов сохраняется.
"| Файл | Строк кода | С русским пояснением |",
# Подписывает колонку строго по измеряемому признаку, не утверждая содержательность найденного текста.
"| Файл | Строк кода | С русским текстом рядом |",
# Продолжает текущий вызов, список или выражение: "| --- | ---: | ---: |",; порядок аргументов сохраняется.
"| --- | ---: | ---: |",
# Продолжает текущий вызов, список или выражение: ]; порядок аргументов сохраняется.

View File

@@ -0,0 +1,18 @@
import re # Разбирает инструкции текстового дизассемблера TI C2000.
import sys # Получает путь к проверяемому листингу OUT.
from pathlib import Path # Читает сохранённый результат dis2000.
text = Path(sys.argv[1]).read_text(encoding="utf-8-sig") # Использует UTF-8-вывод дизассемблера.
for name in ("Seeprom_read", "Seeprom_write"): # Проверяет оба пути публикации задания Timer2.
match = re.search(r"^\w+\s+_" + name + r":$", text, re.M) # Находит начало настоящей функции в готовом OUT.
assert match, "Missing function: " + name # Не допускает успешной проверки неполного листинга.
body = text[match.end():] # Отделяет инструкции от заголовка функции.
end = re.search(r"^\w+\s+_\w+:$", body, re.M) # Ограничивает анализ следующим именованным символом.
body = body[:end.start()] if end else body # Не учитывает записи из другой функции.
request = re.search(r"\bOR\s+\*\+XAR\d\[2\], #0x000[12]", body) # Находит установку запроса чтения 2 или записи 1 в csr.
assert request, "Missing request publication: " + name # Требует известную форму TI O3, иначе проверку нужно пересмотреть.
stores = re.findall(r"\bMOVL\s+\*\+XAR(\d)\[(0|2|4)\],", body[:request.start()]) # Собирает только записи, выполненные до публикации запроса.
groups = {} # Группирует смещения полей по базовому регистру дескриптора.
for register, offset in stores: # Обрабатывает каждую инструкцию записи 32-битного поля.
groups.setdefault(register, set()).add(int(offset)) # Отмечает указатель 0, длину 2 и адрес 4 в словах C28x.
assert any({0, 2, 4} <= offsets for offsets in groups.values()), "Descriptor stores follow request/wait: " + name # Отвергает установленный дефект с отложенными до выхода из ожидания параметрами.
print("PASS TI O3 publication: " + name) # Подтверждает порядок инструкций конкретной функции в данном OUT.

View File

@@ -206,6 +206,38 @@ int main(void) {
request(&rs, 6, 0x7C, 9);
/* Вызывает assert с аргументами (rs.buffer[2] == 2 && modbus[0x7C] == 0x7C) в текущей последовательности операций. */
assert(rs.buffer[2] == 2 && modbus[0x7C] == 0x7C);
/* Запись лимита через штатный FC06 возвращает обычное подтверждение для продолжения обмена GUI. */
request(&rs, 6, 0x7D, 5);
/* Проверяет подтверждение записи пяти попыток в технологическом регистре. */
assert(sent == 10 && rs.buffer[1] == 6 && modbus[0x7D] == 5);
/* Чтение обратно возвращает заданный лимит независимо от текущего счётчика START. */
request(&rs, 3, 0x7D, 1);
/* Проверяет значение 5 как 16-битное слово с нулевым старшим байтом. */
assert(rs.buffer[3] == 0 && rs.buffer[4] == 5);
/* Нулевая настройка отклоняется без изменения предыдущего лимита. */
request(&rs, 6, 0x7D, 0);
/* Код 3 обозначает недопустимое значение; прежний лимит остаётся в RAM. */
assert(sent == 5 && rs.buffer[1] == 0x86 && rs.buffer[2] == 3 && modbus[0x7D] == 5);
/* Верхняя граница проходит проверку без ограничения знаковым представлением int C28x. */
request(&rs, 6, 0x7D, 65535U);
/* Проверяет 16-битный рисунок максимального значения в записанном регистре. */
assert(sent == 10 && (uint16_t)modbus[0x7D] == 65535U);
/* Каждый штатный CAN-слот принимает ненулевую настройку и игнорирует ноль. */
for (unsigned slot = 0; slot < 3; slot++) {
/* Сдвигает начало кадра так, чтобы выбранный маской слот адресовал 0x7D. */
native_can_slots(0x7DU - slot, 0x8000U >> slot, 7, 7, 7);
/* Проверяет принятие лимита без изменения защищённого статуса 0x7C. */
assert(modbus[0x7D] == 7 && modbus[0x7C] == 0x7C);
/* Ноль в том же слоте не заменяет принятую настройку семи пусков. */
native_can_slots(0x7DU - slot, 0x8000U >> slot, 0, 0, 0);
/* Проверяет сохранение прежнего лимита после недопустимого CAN-значения. */
assert(modbus[0x7D] == 7);
/* Проверяет 65535 во всех позициях штатного кадра CAN. */
native_can_slots(0x7DU - slot, 0x8000U >> slot, 65535U, 65535U, 65535U);
/* Сохраняется весь 16-битный рисунок максимального числа пусков. */
assert((uint16_t)modbus[0x7D] == 65535U);
/* Завершает проверку каждого штатного CAN-слота. */
}
/* Existing UMP and protection routing must still work. */
/* Вызывает request с аргументами (&rs, 3, 0x1000, 2) в текущей последовательности операций. */
request(&rs, 3, 0x1000, 2);
@@ -291,8 +323,12 @@ int main(void) {
assert(rs.buffer[2] == 3 && modbus[0x52] == 60000);
/* Вызывает request с аргументами (&rs, 6, 0x507D, 9) в текущей последовательности операций. */
request(&rs, 6, 0x507D, 9);
/* Вызывает assert с аргументами (rs.buffer[2] == 2 && modbus[0x7D] == 0x7D) в текущей последовательности операций. */
assert(rs.buffer[2] == 2 && modbus[0x7D] == 0x7D);
/* GAS-псевдоним возвращает подтверждение записи девяти попыток с исходным адресом запроса. */
assert(sent == 8 && rs.buffer[1] == 6 && modbus[0x7D] == 9);
/* Ноль отклоняется и через GAS, не перезаписывая принятый лимит. */
request(&rs, 6, 0x507D, 0);
/* Код 3 отличает недопустимое значение от недоступного адреса; лимит остаётся равным девяти. */
assert(sent == 5 && rs.buffer[2] == 3 && modbus[0x7D] == 9);
/* Вызывает request с аргументами (&rs, 6, 0x507F, 0x80) в текущей последовательности операций. */
request(&rs, 6, 0x507F, 0x80);
/* Вызывает assert с аргументами (sent == 8 && rs.buffer[2] == 0x50 && rs.buffer[3] == 0x7F) в текущей последовательности операций. */
@@ -336,6 +372,14 @@ int main(void) {
can_request(6, 0x507C, 9);
/* Вызывает assert с аргументами ((ECanaMboxes.MBOX2.MDH.all & 255U) == 2 && modbus[0x7C] == 0x7C) в текущей последовательности операций. */
assert((ECanaMboxes.MBOX2.MDH.all & 255U) == 2 && modbus[0x7C] == 0x7C);
/* Служебный CAN использует тот же GAS-псевдоним для изменения лимита попыток. */
can_request(6, 0x507D, 7);
/* Проверяет успешный ответ с исходным GAS-адресом и новый лимит семи пусков. */
assert((ECanaMboxes.MBOX2.MDH.all & 255U) == 0 && ECanaMboxes.MBOX2.MDL.all == 0x507D0007UL && modbus[0x7D] == 7);
/* Недопустимый ноль отклоняется по служебному CAN без изменения последней настройки. */
can_request(6, 0x507D, 0);
/* Проверяет код Modbus 3 и отсутствие изменения настроенного лимита. */
assert((ECanaMboxes.MBOX2.MDH.all & 255U) == 3 && modbus[0x7D] == 7);
/* Вызывает can_request с аргументами (6, 0x507F, 0x40) в текущей последовательности операций. */
can_request(6, 0x507F, 0x40);
/* Вызывает assert с аргументами (captures == 2 && modbus[127] == 0x40) в текущей последовательности операций. */

View File

@@ -63,6 +63,21 @@ routes = can_globals + "\n" + "".join(function(message, name) for name in
("modbus_exception", "receive_ump", "ReceiveCommandModbus3", "ReceiveCommandModbus6"))
# Задаёт routes + по выражению справа; значение используется последующими операциями.
routes += function(ecan, "UMP_CAN_service")
# Берёт три записи штатного CAN из рабочего обработчика, чтобы проверки не копировали его условия.
slots_start = ecan.index("\tfor (slot = 0; slot < 3; slot++, adr++, mask <<= 1)")
# Завершает фрагмент перед журналированием; оно не влияет на доступность технологических регистров.
slots_end = ecan.index("/* Фиксируем применённую команду", slots_start)
# Обёртка задаёт только поля кадра; проверки доступа остаются извлечённым рабочим кодом.
routes += """/* Проверяет рабочие записи CAN без аппаратных mailbox и обработки остальных событий ISR. */
static void native_can_slots(unsigned int adr, unsigned int mask, int a, int b, int c) {
/* Индекс выбирает одно из трёх слов; маска достоверности передана вызывающим тестом в аргументе mask. */
unsigned int slot;
/* Передаёт исходные слова рабочим условиям записи регистра. */
int Data[3] = {a, b, c};
"""
# Добавляет неизменённый фрагмент Handlai и закрывает обёртку с пояснением назначения блока.
routes += ecan[slots_start:slots_end] + "/* Завершает записи трёх слов штатного CAN-кадра. */\n}\n"
# Открывает управляемый ресурс tempfile.TemporaryDirectory(prefix="gas167-test-") as tmp с автоматическим освобождением.
with tempfile.TemporaryDirectory(prefix="gas167-test-") as tmp:
# Задаёт directory по выражению справа; значение используется последующими операциями.

View File

@@ -15,8 +15,6 @@ unsigned int test_start, test_stop, test_permission, test_tick;
unsigned int test_starts, test_last_stop_tick, test_last_start_tick, test_init_dac;
/* Объявляет test_bad_order — данные test_bad_order. */
int test_bad_order;
/* Объявляет ump_dac_ramp — ump ЦАП ramp; ump_dac_duration — ump ЦАП duration; ump_dac_go10 — ump ЦАП go 10; ump_dac_stop10 — ump ЦАП stop 10; ump_dac_position — ump ЦАП position. */
unsigned int ump_dac_ramp, ump_dac_duration, ump_dac_go10, ump_dac_stop10, ump_dac_position;
/* Задаёт CHECK = do { if (!(x)) { printf("FAIL line %d: %s\n", __LINE__, #x); return 1; } } while (0); данные CHECK. */
#define CHECK(x) do { if (!(x)) { printf("FAIL line %d: %s\n", __LINE__, #x); return 1; } } while (0)
/* Начинает функцию setup; назначение модуля — проверка load_control на модели ПК. */
@@ -45,10 +43,167 @@ static void tick(unsigned int n, int exchange, unsigned int volts) {
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Точка входа: настраивает периферию, загружает параметры и обслуживает команды в главном цикле. */
/* Проверяет штатные 6 мА, трёхсекундную реакцию ЗПТ и сохранение защитных остановов на настоящем DAC.c. */
static int startup_test(void) {
/* mode перебирает УМП 5/6, attempt контролирует пять пусков, code хранит отправленный код, count — оставшиеся токовые такты ожидания. */
unsigned int mode, attempt, code, count;
/* Проверяет оба штатных CAN-индекса: ЗПТ1 у УМП 5 и ЗПТ2 у УМП 6. */
for (mode = 5; mode <= 6; mode++) {
/* Подаёт START при заводских 6 мА и свежем нулевом ЗПТ; первые 10 мс включают базовый и стартовый кадры ЦАП. */
setup(mode); DAC_go = 6; Commands = 0x80; tick(10, 1, 0);
/* Первая попытка должна удерживать разрешение и получить 6 мА вместо мгновенного STOP. */
CHECK(test_starts == 1 && test_start && test_permission && !test_stop && modbus[0x1C] == 60 && modbus[123] != DAC_min());
/* Запоминает код 6 мА для исключения скрытого повышения тока до подтверждённых 30 В. */
code = modbus[123];
/* Проверяет последний миллисекундный такт перед тремя секундами от первой отправки 6 мА. */
tick(2999, 1, 29);
/* До конца выдержки сохраняет одну попытку, рабочее состояние и прежнее задание в масштабе 0,1 мА. */
CHECK(load_state == LOAD_RUN && load_attempts == 1 && modbus[0x1C] == 60 && (unsigned int)modbus[123] == code);
/* Ровно через 3000 мс свежее ЗПТ ниже 30 В должно завершить попытку защитным сбросом. */
tick(1, 1, 29);
/* Проверяет STOP, снятое разрешение и передачу базового тока 4 мА через калибровочный минимум. */
CHECK(load_state == LOAD_RELOAD && test_stop && !test_permission && modbus[0x1C] == 40 && modbus[123] == DAC_min());
/* После секунды STOP вторая попытка должна снова получить 6 мА и собственные три секунды ожидания. */
tick(1000, 1, 0);
/* Исключает повторный START и немедленный STOP в одном вызове обработчика. */
CHECK(test_starts == 2 && test_start && !test_stop && modbus[0x1C] == 60);
/* Проходит оставшиеся четыре попытки по реальному миллисекундному времени без ускорения рампы. */
for (attempt = 2; attempt <= 5; attempt++) {
/* Даёт каждой попытке 3000 мс свежего нулевого ЗПТ после начальной отправки 6 мА. */
tick(3000, 1, 0);
/* Проверяет возврат к 4 мА и полную выдержку каждой попытки до STOP. */
CHECK(test_stop && !test_permission && load_attempts == attempt && modbus[0x1C] == 40 && test_last_stop_tick - test_last_start_tick >= 3000);
/* До пятой попытки соблюдает дополнительную секунду STOP, после пятой повтор запрещён. */
if (attempt < 5) tick(1000, 1, 0);
/* Закрывает перебор разрешённых пусков. */
}
/* Достаточное ЗПТ после ошибки само по себе не должно давать шестой пуск. */
tick(3000, 1, 30);
/* Проверяет удержание ошибки, STOP и соблюдение порядка START/STOP/разрешения. */
CHECK(test_starts == 5 && (LOAD_STATUS & 1) && test_stop && !test_bad_order);
/* Закрывает независимые проверки обоих адресов УМП. */
}
/* Подаёт достаточное ЗПТ в последний такт выдержки: порог 30 В должен иметь приоритет перед истечением ожидания. */
setup(5); DAC_go = 6; Commands = 0x80; tick(3009, 1, 29); tick(1, 1, 30);
/* Проверяет, что на границе 3000 мс от первого токового кадра не произошло ложного STOP или второго START. */
CHECK(load_state == LOAD_RUN && test_starts == 1 && !test_stop && test_permission);
/* Даёт УМП 5 две секунды низкого ЗПТ при начальном токе 6 мА: первый токовый кадр отправляется на 10 мс. */
setup(5); DAC_go = 6; Commands = 0x80; tick(2010, 1, 29);
/* Устройство должно продолжать ожидание на первой попытке без роста выше 6 мА. */
CHECK(load_attempts == 1 && modbus[0x1C] == 60 && !test_stop);
/* Запоминает начальный код для проверки роста после прихода достаточного ЗПТ. */
code = modbus[123];
/* Ровно 30 В разрешают разгон; за 300 мс изменение видно даже при разрешении регистра 0,1 мА. */
tick(300, 1, 30);
/* Проверяет продолжение первой попытки и рост отправленного токового задания. */
CHECK(test_starts == 1 && load_state == LOAD_RUN && modbus[0x1C] > 60 && (unsigned int)modbus[123] > code);
/* После успешного роста падение до 29 В не получает дополнительную трёхсекундную выдержку. */
tick(5, 1, 29); CHECK(load_state == LOAD_RELOAD && test_stop && modbus[0x1C] == 40);
/* Даже повышенная начальная уставка 9 мА должна ограничиваться 6 мА до подтверждения роста ЗПТ. */
setup(5); DAC_go = 9; Commands = 0x80; tick(10, 1, 0);
/* Исключает преждевременную передачу повышенного начального задания при низком ЗПТ. */
CHECK(modbus[0x1C] == 60 && load_state == LOAD_RUN && test_starts == 1);
/* После исчезновения CAN отправленное задание должно остаться 6 мА, даже если начальная уставка равна 9 мА. */
tick(1000, 0, 0); CHECK((LOAD_STATUS & 2) && modbus[0x1C] == 60);
/* Короткий тайм-аут 20 мс позволяет проверить приостановку стартовой выдержки при потере выбранного CAN-напряжения. */
setup(5); DAC_go = 6; LOAD_CAN_TIMEOUT = 20; Commands = 0x80; tick(10, 1, 0);
/* Дожидается устаревания последнего ЗПТ без новых кадров. */
tick(30, 0, 0);
/* Сохраняет остаток стартовых отправок и последний код после перехода в паузу CAN. */
count = load_start_remaining; code = modbus[123];
/* Отсутствие CAN дольше всей выдержки не должно расходовать её остаток или следующую попытку. */
tick(4000, 0, 0);
/* Проверяет удержание кода, счётчика ожидания, разрешения и первой попытки во время тайм-аута. */
CHECK((LOAD_STATUS & 2) && load_start_remaining == count && (unsigned int)modbus[123] == code && load_attempts == 1 && !test_stop);
/* Свежее низкое ЗПТ возобновляет отсчёт от сохранённого значения. */
tick(5, 1, 29); CHECK(!(LOAD_STATUS & 2) && load_start_remaining == count - 1 && test_starts == 1);
/* RESET должен прекратить ожидание сразу и отправить 4 мА на ближайшем токовом такте. */
Commands = 0xC0; tick(5, 1, 29); CHECK(test_stop && !test_permission && modbus[0x1C] == 40);
/* Ручная калибровка вместе со START не должна подменять стартовое задание. */
setup(5); DAC_go = 6; Commands = 0x280; DAC_cal() = 4095; tick(6, 1, 0);
/* Команда инициализации на первом токовом такте не подтверждает отправку 6 мА и не расходует выдержку. */
cInitDac = 1; tick(4, 1, 0); CHECK(load_start_remaining == 600 && modbus[0x1C] == 40);
/* Следующий такт должен выдать настоящий начальный ток вместо ручного кода 4095. */
tick(5, 1, 0); CHECK(modbus[0x1C] == 60 && modbus[123] != 4095 && load_start_remaining == 599);
/* Последний такт перед тремя секундами от токового кадра ещё сохраняет ожидание. */
tick(2999, 1, 0); CHECK(load_state == LOAD_RUN);
/* Следующий такт завершает выдержку и возвращает 4 мА без подмены ручной калибровкой. */
tick(1, 1, 0); CHECK(load_state == LOAD_RELOAD && modbus[0x1C] == 40 && modbus[123] == DAC_min());
/* Возвращает успех после проверки реакции ЗПТ, пяти попыток, CAN, RESET и калибровки. */
return 0;
/* Закрывает проверку стартового этапа нагрузки. */
}
/* Проверяет настраиваемый лимит, независимость счётчика, уменьшение лимита в паузе STOP и верхнюю 16-битную границу. */
static int attempt_limit_test(void) {
/* Адреса 5/6 выбирают оба УМП; limit задаёт общий предел START, attempt считает проверяемые неудачи. */
unsigned int mode, limit, attempt, out[8], error;
/* Ноль из старой EEPROM должен превратиться в прежние заводские пять пусков. */
setup(5); CHECK(LOAD_MAX_ATTEMPTS == 5);
/* Подготовка тактов ЦАП после загрузки параметров обязана сохранять ненулевую пользовательскую настройку. */
LOAD_MAX_ATTEMPTS = 7; Setup_DAC_time(); CHECK(LOAD_MAX_ATTEMPTS == 7);
/* Проверяет одинаковый смысл лимита для ЗПТ1 и ЗПТ2, выбранных штатными CAN-адресами. */
for (mode = 5; mode <= 6; mode++) {
/* Значения 1, 2 и 7 проверяют отсутствие дополнительных пусков и снятие прежнего жёсткого предела пяти. */
for (limit = 1; limit <= 7; limit = limit == 1 ? 2 : 7) {
/* Новый сеанс начинает работу с указанным пределом; START включается только штатной командой. */
setup(mode); LOAD_MAX_ATTEMPTS = limit; Commands = 0x80;
/* Каждая успешная реакция ЗПТ позволяет затем проверить немедленную защиту при его падении. */
for (attempt = 1; attempt <= limit; attempt++) {
/* Даёт 1010 мс на первый пуск либо окончание секундного STOP перед очередным START. */
tick(1010, 1, 30);
/* Переводит рампу выше границы 6 мА при достаточном ЗПТ, затем имитирует его падение до нуля. */
load_count_ramp = time_dac / 6; tick(5, 1, 30); tick(5, 1, 0);
/* Проверяет число реальных START и неизменность записанного лимита после работы Timer1. */
CHECK(test_starts == attempt && load_attempts == attempt && LOAD_MAX_ATTEMPTS == (int)limit);
/* До последней попытки допускается повтор; последняя неудача обязана зафиксировать LOAD_FAULT. */
CHECK(load_state == (attempt == limit ? LOAD_FAULT : LOAD_RELOAD));
/* Завершает проверку всех разрешённых попыток текущего сеанса. */
}
/* Достаточное напряжение и повышение лимита сами по себе не снимают уже зафиксированную ошибку. */
LOAD_MAX_ATTEMPTS = limit + 1; tick(3000, 1, 30);
/* Счётчик остаётся прежним, аппаратный STOP и запрет разрешения сохраняются после изменения настройки. */
CHECK(test_starts == limit && load_attempts == limit && test_stop && !test_permission);
/* Диагностический блок версии 1 продолжает возвращать текущий счётчик в слове 5, независимо от лимита 0x7D. */
CHECK(Load_protection_prepare(3, 0x1300, 8, out, &error) == 8 && !error && out[5] == limit);
/* Снятие START обнуляет счётчик, но сохраняет лимит для следующего сеанса пуска. */
Commands = 0; tick(1000, 1, 30); CHECK(!load_attempts && LOAD_MAX_ATTEMPTS == (int)(limit + 1));
/* Значение 7 — последний сценарий; выход исключает повторение итерации с неизменным limit. */
if (limit == 7) break;
/* Завершает перебор проверяемых пользовательских лимитов. */
}
/* Завершает проверку обоих адресов УМП. */
}
/* Подготавливает первый неудачный пуск с разрешёнными пятью попытками. */
setup(5); Commands = 0x80; tick(1010, 1, 30);
/* Падение уже подтверждённого ЗПТ переводит автомат в секундный STOP перед повтором. */
load_count_ramp = time_dac / 6; tick(5, 1, 0); CHECK(load_state == LOAD_RELOAD);
/* Уменьшает предел до уже использованной одной попытки во время STOP, проверяя защиту перед следующим START. */
LOAD_MAX_ATTEMPTS = 1; tick(3000, 1, 30); CHECK(load_state == LOAD_FAULT && test_starts == 1);
/* Верхняя граница регистра сохраняется после подготовки автомата и не трактуется как отрицательный лимит. */
setup(6); LOAD_MAX_ATTEMPTS = 65535U; Setup_DAC_time(); WAKEpowse = 0;
/* Проверяет чтение максимального 16-битного значения без обнуления пользовательской настройки. */
CHECK((unsigned int)LOAD_MAX_ATTEMPTS == 65535U);
/* Доводит первый пуск до защитной паузы, затем моделирует последнюю попытку без 65534 циклов ожидания. */
Commands = 0x80; tick(1010, 1, 30); load_count_ramp = time_dac / 6; tick(5, 1, 0);
/* Значение 65534 соответствует числу ранее выданных START перед последней разрешённой попыткой. */
load_attempts = 65534U; tick(1000, 1, 30); CHECK(load_attempts == 65535U && test_starts == 2);
/* Последняя неудача фиксирует ошибку до возможного переполнения 16-битного счётчика. */
load_count_ramp = time_dac / 6; tick(5, 1, 0); tick(3000, 1, 30);
/* Проверяет удержание максимального счётчика, отсутствие дополнительного START и неизменность лимита. */
CHECK(load_state == LOAD_FAULT && load_attempts == 65535U && test_starts == 2 && (unsigned int)LOAD_MAX_ATTEMPTS == 65535U);
/* Возвращает успех после проверки сохранения лимита и пограничных сценариев его применения. */
return 0;
/* Завершает проверки настраиваемого количества попыток запуска. */
}
/* Запускает новые стартовые сценарии и прежние регрессии автомата на программных подменах периферии. */
int main(void) {
/* Объявляет out — данные out; error — ошибка; count — число; ramp — данные ramp; code — данные code. */
unsigned int out[8], error, count, ramp, code, stopped_at;
/* Сначала проверяет исправляемый штатный пуск с 6 мА, затем выполняет остальные регрессии защиты. */
CHECK(startup_test() == 0);
/* Дополнительно проверяет записываемый лимит 0x7D до прежних регрессий автомата нагрузки. */
CHECK(attempt_limit_test() == 0);
/* Вызывает setup с аргументами (5) в текущей последовательности операций. */
setup(5);
/* Boot ISR before parameters: no divide-by-zero and no GPIO start. */
@@ -76,18 +231,18 @@ int main(void) {
/* Freeze current and code at timeout; unrelated exchange cannot unfreeze. */
/* Вызывает tick с аргументами (1000, 1, 30); tick(600, 0, 0) в текущей последовательности операций. */
tick(1000, 1, 30); tick(600, 0, 0);
/* Записывает ramp значением ump_dac_ramp; code = modbus[123]; данные ramp. */
ramp = ump_dac_ramp; code = modbus[123];
/* Вызывает tick с аргументами (2000, 0, 0); CHECK(ump_dac_ramp == ramp && (unsigned int)modbus[123] == code) в текущей последовательности операций. */
tick(2000, 0, 0); CHECK(ump_dac_ramp == ramp && (unsigned int)modbus[123] == code);
/* Записывает ramp значением load_count_ramp; code = modbus[123]; данные ramp. */
ramp = load_count_ramp; code = modbus[123];
/* Вызывает tick с аргументами (2000, 0, 0); CHECK(load_count_ramp == ramp && (unsigned int)modbus[123] == code) в текущей последовательности операций. */
tick(2000, 0, 0); CHECK(load_count_ramp == ramp && (unsigned int)modbus[123] == code);
/* Вызывает CHECK с аргументами (test_permission && !test_stop && (LOAD_STATUS & 2)) в текущей последовательности операций. */
CHECK(test_permission && !test_stop && (LOAD_STATUS & 2));
/* Вызывает Load_voltage_can. Принимает напряжение выбранной нагрузки из достоверных слов CAN и сбрасывает возраст только нужного измерения. */
Load_voltage_can(0x8000U | 8U, 200, 0, 0); tick(10, 0, 0);
/* Вызывает CHECK с аргументами (ump_dac_ramp == ramp) в текущей последовательности операций. */
CHECK(ump_dac_ramp == ramp);
/* Вызывает tick с аргументами (10, 1, 30); CHECK(ump_dac_ramp > ramp) в текущей последовательности операций. */
tick(10, 1, 30); CHECK(ump_dac_ramp > ramp);
/* Вызывает CHECK с аргументами (load_count_ramp == ramp) в текущей последовательности операций. */
CHECK(load_count_ramp == ramp);
/* Вызывает tick с аргументами (10, 1, 30); CHECK(load_count_ramp > ramp) в текущей последовательности операций. */
tick(10, 1, 30); CHECK(load_count_ramp > ramp);
/* Exactly 30 V permits growth; 29 V fails strictly above 6 mA. */
/* Записывает Commands значением 0x80; tick(10, 1, 30); слово команд, технологический регистр 127. */
setup(6); Commands = 0x80; tick(10, 1, 30);
@@ -97,8 +252,8 @@ int main(void) {
CHECK(load_state == LOAD_RUN && modbus[0x1C] >= 60);
/* Вызывает tick с аргументами (5, 1, 29); CHECK(load_state == LOAD_RELOAD && test_stop && !test_permission) в текущей последовательности операций. */
tick(5, 1, 29); CHECK(load_state == LOAD_RELOAD && test_stop && !test_permission);
/* Вызывает CHECK с аргументами (!test_start && ump_dac_ramp == 0 && modbus[0x1C] == 40) в текущей последовательности операций. */
CHECK(!test_start && ump_dac_ramp == 0 && modbus[0x1C] == 40);
/* Вызывает CHECK с аргументами (!test_start && load_count_ramp == 0 && modbus[0x1C] == 40) в текущей последовательности операций. */
CHECK(!test_start && load_count_ramp == 0 && modbus[0x1C] == 40);
/* Записывает stopped_at значением test_last_stop_tick; данные stopped_at. */
CHECK(modbus[123] == DAC_min()); stopped_at = test_last_stop_tick;
/* Вызывает tick с аргументами (999, 1, 0); CHECK(test_starts == 1 && test_stop) в текущей последовательности операций. */
@@ -116,16 +271,16 @@ int main(void) {
if (load_state == LOAD_RELOAD) tick(1000, 1, 0);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Вызывает CHECK с аргументами (test_starts == 5 && LOAD_ATTEMPTS == 5 && (LOAD_STATUS & 1)) в текущей последовательности операций. */
CHECK(test_starts == 5 && LOAD_ATTEMPTS == 5 && (LOAD_STATUS & 1));
/* Вызывает CHECK с аргументами (test_starts == 5 && load_attempts == 5 && (LOAD_STATUS & 1)) в текущей последовательности операций. */
CHECK(test_starts == 5 && load_attempts == 5 && (LOAD_STATUS & 1));
/* Вызывает tick с аргументами (3000, 1, 200); CHECK(test_starts == 5 && test_stop && !test_permission) в текущей последовательности операций. */
tick(3000, 1, 200); CHECK(test_starts == 5 && test_stop && !test_permission);
/* Записывает Commands значением 0xC0; tick(10, 1, 200); CHECK(load_state == LOAD_FAULT); слово команд, технологический регистр 127. */
Commands = 0xC0; tick(10, 1, 200); CHECK(load_state == LOAD_FAULT);
/* Записывает Commands значением 0; tick(1000, 1, 200); CHECK(!(LOAD_STATUS & 1)); слово команд, технологический регистр 127. */
Commands = 0; tick(1000, 1, 200); CHECK(!(LOAD_STATUS & 1));
/* Записывает Commands значением 0x80; test_starts = 0; tick(10, 1, 200); CHECK(LOAD_ATTEMPTS == 1); слово команд, технологический регистр 127. */
Commands = 0x80; test_starts = 0; tick(10, 1, 200); CHECK(LOAD_ATTEMPTS == 1);
/* Записывает Commands значением 0x80; test_starts = 0; tick(10, 1, 200); CHECK(load_attempts == 1); слово команд, технологический регистр 127. */
Commands = 0x80; test_starts = 0; tick(10, 1, 200); CHECK(load_attempts == 1);
/* Manual reset dominates START; releasing it alone cannot start again. */
/* Записывает Commands значением 0xC0; tick(1, 1, 200); CHECK(test_stop && !test_permission); слово команд, технологический регистр 127. */
Commands = 0xC0; tick(1, 1, 200); CHECK(test_stop && !test_permission);
@@ -150,12 +305,12 @@ int main(void) {
Load_protection_prepare(6, 0x1302, 1, out, &error); CHECK(!error);
/* Вызывает tick с аргументами (30, 1, 200); CHECK(LOAD_STATUS & 2) в текущей последовательности операций. */
tick(30, 1, 200); CHECK(LOAD_STATUS & 2);
/* Записывает ramp значением ump_dac_ramp; tick(100, 1, 200); CHECK(ump_dac_ramp == ramp); данные ramp. */
ramp = ump_dac_ramp; tick(100, 1, 200); CHECK(ump_dac_ramp == ramp);
/* Записывает ramp значением load_count_ramp; tick(100, 1, 200); CHECK(load_count_ramp == ramp); данные ramp. */
ramp = load_count_ramp; tick(100, 1, 200); CHECK(load_count_ramp == ramp);
/* Вызывает Load_protection_prepare. Фиксирует управляющие входы перед выполнением автомата защиты нагрузки. */
Load_protection_prepare(6, 0x1302, 0, out, &error);
/* Вызывает tick с аргументами (10, 1, 200); CHECK(!(LOAD_STATUS & 2) && ump_dac_ramp > ramp) в текущей последовательности операций. */
tick(10, 1, 200); CHECK(!(LOAD_STATUS & 2) && ump_dac_ramp > ramp);
/* Вызывает tick с аргументами (10, 1, 200); CHECK(!(LOAD_STATUS & 2) && load_count_ramp > ramp) в текущей последовательности операций. */
tick(10, 1, 200); CHECK(!(LOAD_STATUS & 2) && load_count_ramp > ramp);
/* Вызывает Load_protection_prepare. Фиксирует управляющие входы перед выполнением автомата защиты нагрузки. */
Load_protection_prepare(6, 0x1302, 2, out, &error);
/* Записывает load_count_ramp значением time_dac / 6; tick(5, 1, 200); CHECK(load_state == LOAD_RELOAD); load число ramp. */
@@ -177,10 +332,10 @@ int main(void) {
/* Вызывает tick с аргументами (1, 1, 200); CHECK(test_starts == 1) в текущей последовательности операций. */
tick(1, 1, 200); CHECK(test_starts == 1);
/* Timeout while STOP is held cannot initiate the pending retry. */
/* Записывает Commands значением 0x80; tick(10, 1, 0); слово команд, технологический регистр 127. */
setup(5); Commands = 0x80; tick(10, 1, 0);
/* Записывает load_count_ramp значением time_dac / 6; tick(5, 1, 0); load число ramp. */
load_count_ramp = time_dac / 6; tick(5, 1, 0);
/* Начинает пуск с заводскими 6 мА и свежим нулевым ЗПТ, чтобы затем проверить исчезновение CAN во время STOP. */
setup(5); DAC_go = 6; Commands = 0x80; tick(10, 1, 0);
/* Даёт три секунды на реакцию ЗПТ после первой отправки 6 мА, затем проверяет потерю CAN во время защитного сброса. */
tick(3000, 1, 0);
/* Вызывает CHECK с аргументами (load_state == LOAD_RELOAD) в текущей последовательности операций. */
CHECK(load_state == LOAD_RELOAD);
/* Вызывает tick с аргументами (1500, 0, 0); CHECK(test_starts == 1 && test_stop) в текущей последовательности операций. */
@@ -189,8 +344,9 @@ int main(void) {
tick(1, 1, 0); CHECK(test_starts == 2 && !test_stop);
/* Вызывает Load_control_init. Сбрасывает все переменные автомата нагрузки до разрешения прерываний; COFF не обнуляет всю .ebss. */
Load_control_init(); CHECK(!load_simulation);
/* Вызывает puts с аргументами ("PASS: production DAC control, timeout, CAN slots, STOP ordering, five attempts, simulation") в текущей последовательности операций. */
puts("PASS: production DAC control, timeout, CAN slots, STOP ordering, five attempts, simulation");
/* Сообщает об успехе проверки реального автомата, включая новый старт 6 мА с выдержкой 3 секунды и прежние защитные сценарии. */
/* Сообщает о проверке рабочих исходников, настраиваемого лимита и прежних режимов защиты нагрузки. */
puts("PASS: production DAC control, startup, timeout, CAN, STOP ordering, writable attempt limit, simulation");
/* Завершает main и возвращает 0. */
return 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */

View File

@@ -25,8 +25,10 @@ extern unsigned int test_init_dac;
#define LOAD_CAN_TIMEOUT modbus[0x52]
/* Задаёт LOAD_STATUS = modbus[0x7C]; слово состояния защиты нагрузки для чтения, регистр 0x7C. */
#define LOAD_STATUS modbus[0x7C]
/* Задаёт LOAD_ATTEMPTS = modbus[0x7D]; число попыток пуска для чтения, регистр 0x7D. */
#define LOAD_ATTEMPTS modbus[0x7D]
/* Задаёт записываемый лимит общего числа пусков в регистре 0x7D; допустимы 1..65535 попыток, включая первый START. */
#define LOAD_MAX_ATTEMPTS modbus[0x7D]
/* Сохраняет прежний заводской предел пяти пусков для сброса настроек и замены нуля из старой EEPROM. */
#define LOAD_DEFAULT_MAX_ATTEMPTS 5U
/* Задаёт DAC_min = modbus[0x79]; ЦАП min. */
#define DAC_min() modbus[0x79]
/* Задаёт DAC_max = modbus[0x78]; ЦАП max. */

View File

@@ -1,3 +1,4 @@
static char size_cmd15; /* Моделирует локальную настройку длины команды, которую заполняет create_uart_vars. */
/* Проверка rs232_fifo на модели ПК. Русские пояснения сохранены в UTF-8. */
/* Продолжает список аргументов, полей или выражение volatile struct SCI_REGS SciaRegs,ScibRegs;; порядок элементов сохраняется. */
@@ -142,6 +143,15 @@ int main(void)
unsigned data[4200],sizes[]={0,1,2,7,8,15,16,17,31,120,253,400,8194};
/* Продолжает список аргументов, полей или выражение unsigned a,n,i,mode;unsigned request[]={16,3,0x10,0,0,16,0,0};; порядок элементов сохраняется. */
unsigned a,n,i,mode;unsigned request[]={16,3,0x10,0,0,16,0,0};
RS_DATA expected = {0}; /* Задаёт чистое состояние порта независимо от содержимого моделируемой RAM. */
memset(&rs_a, 0xA5, sizeof(rs_a)); /* Воспроизводит ненулевые длины, указатели и флаги SCI-A после загрузки COFF. */
memset(&rs_b, 0x5A, sizeof(rs_b)); /* Проверяет независимый сброс второго порта с другим рисунком мусора. */
create_uart_vars(17); /* Вызывает настоящую загрузочную инициализацию до разрешения IRQ. */
expected.commnumber = COM_1; /* Единственным ненулевым полем после общего сброса должен быть номер первого порта. */
assert(memcmp(&rs_a, &expected, sizeof(rs_a)) == 0); /* Проверяет все поля и оба буфера первого порта, включая флаги готовности. */
expected.commnumber = COM_2; /* Подготавливает ожидаемое состояние второго порта. */
assert(memcmp(&rs_b, &expected, sizeof(rs_b)) == 0 && size_cmd15 == 17); /* Проверяет второй порт и сохранение настройки длины команды. */
/* Цикл for(mode=0;mode<2;mode++)for(a=0;a<sizeof(sizes)/sizeof(sizes[0]);a++) ; задаёт начальное значение, условие продолжения и шаг перебора. */
for(mode=0;mode<2;mode++)for(a=0;a<sizeof(sizes)/sizeof(sizes[0]);a++) {
/* Записывает n значением sizes[a];for(i=0;i<4200;i++)data[i]=(i*131U+17U)&65535; данные n. */

View File

@@ -22,8 +22,8 @@ def read(path):
return re.sub(r'/\*.*?\*/|//[^\n]*','',path.read_bytes().decode('utf-8').replace('\r\n','\n'),flags=re.S)
# Задаёт source по выражению справа; значение используется последующими операциями.
source=read(root/'Source/Internal/RS485.c')
# Задаёт names по выражению справа; значение используется последующими операциями.
names=['RS_RX_Handler','RS_TX_Handler','RS_Send','RS_BSend','RS_SetBitMode',
# Извлекает инициализацию и обработчики UART, чтобы проверить старт на неочищенной RAM вместе с обменом.
names=['create_uart_vars','RS_RX_Handler','RS_TX_Handler','RS_Send','RS_BSend','RS_SetBitMode',
# Продолжает текущий вызов, список или выражение: 'RS_FifoWait','RS_FifoTx','RS_FifoStart','RS_FifoAbort','RS_FifoTick1ms']; порядок аргументов сохраняется.
'RS_FifoWait','RS_FifoTx','RS_FifoStart','RS_FifoAbort','RS_FifoTick1ms']
# Задаёт prototypes по выражению справа; значение используется последующими операциями.

View File

@@ -34,25 +34,17 @@ int main(void)
ump_archive_count = ump_archive_next = ump_generation = 0xA5A5;
/* Записывает ump_source значением ump_post = 0xA5A5; данные ump_source. */
ump_source = ump_post = 0xA5A5;
/* Записывает ump_can_header значением ump_can_count = 0xA5A5; ump CAN header. */
ump_can_header = ump_can_count = 0xA5A5;
/* Цикл for (i = 0; i < 3; i++) ump_can_data[i] = 0xA5A5;; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 0; i < 3; i++) ump_can_data[i] = 0xA5A5;
/* Цикл for (i = 0; i < 2; i++) ump_pm67_voltage[i] = 0xA5A5;; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 0; i < 2; i++) ump_pm67_voltage[i] = 0xA5A5;
/* Записывает ump_prev_commands значением ump_prev_inputs = ump_prev_outputs = 0xA5A5; данные ump_prev_commands. */
ump_prev_commands = ump_prev_inputs = ump_prev_outputs = 0xA5A5;
/* Записывает ump_dac_ramp значением ump_dac_duration = ump_dac_go10 = 0xA5A5; ump ЦАП ramp. */
ump_dac_ramp = ump_dac_duration = ump_dac_go10 = 0xA5A5;
/* Записывает ump_dac_stop10 значением ump_dac_position = 0xA5A5; ump ЦАП stop 10. */
ump_dac_stop10 = ump_dac_position = 0xA5A5;
/* Вызывает ump_log_init. Явно инициализирует оба банка регистратора до включения IRQ; повторный старт записи архив не стирает. */
ump_log_init();
/* Вызывает CHECK с аргументами (ump_log_read(UMP_LOG_BASE) == 0x554D) в текущей последовательности операций. */
CHECK(ump_log_read(UMP_LOG_BASE) == 0x554D);
/* Вызывает CHECK с аргументами (ump_log_read(UMP_LOG_BASE+1) == 3) в текущей последовательности операций. */
CHECK(ump_log_read(UMP_LOG_BASE+1) == 3);
/* Вызывает CHECK с аргументами (ump_log_read(UMP_LOG_BASE+1) == 4) в текущей последовательности операций. */
CHECK(ump_log_read(UMP_LOG_BASE+1) == 4);
/* Вызывает CHECK с аргументами (ump_log_read(UMP_LOG_BASE+2) == 0) в текущей последовательности операций. */
CHECK(ump_log_read(UMP_LOG_BASE+2) == 0);
/* Вызывает CHECK с аргументами (ump_log_read(UMP_LOG_BASE+3) == 0) в текущей последовательности операций. */
@@ -69,18 +61,10 @@ int main(void)
CHECK(ump_cursor == 0 && ump_next == 0 && ump_archive_next == 0);
/* Вызывает CHECK с аргументами (ump_divider == 0 && ump_sequence == 0 && ump_post == 0) в текущей последовательности операций. */
CHECK(ump_divider == 0 && ump_sequence == 0 && ump_post == 0);
/* Вызывает CHECK с аргументами (ump_can_header == 0 && ump_can_count == 0) в текущей последовательности операций. */
CHECK(ump_can_header == 0 && ump_can_count == 0);
/* Цикл for (i = 0; i < 3; i++) CHECK(ump_can_data[i] == 0);; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 0; i < 3; i++) CHECK(ump_can_data[i] == 0);
/* Цикл for (i = 0; i < 2; i++) CHECK(ump_pm67_voltage[i] == 0);; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 0; i < 2; i++) CHECK(ump_pm67_voltage[i] == 0);
/* Вызывает CHECK с аргументами (ump_prev_commands == 0 && ump_prev_inputs == 0 && ump_prev_outputs == 0) в текущей последовательности операций. */
CHECK(ump_prev_commands == 0 && ump_prev_inputs == 0 && ump_prev_outputs == 0);
/* Вызывает CHECK с аргументами (ump_dac_ramp == 0 && ump_dac_duration == 0 && ump_dac_go10 == 0) в текущей последовательности операций. */
CHECK(ump_dac_ramp == 0 && ump_dac_duration == 0 && ump_dac_go10 == 0);
/* Вызывает CHECK с аргументами (ump_dac_stop10 == 0 && ump_dac_position == 0) в текущей последовательности операций. */
CHECK(ump_dac_stop10 == 0 && ump_dac_position == 0);
/* Вызывает CHECK с аргументами (ump_log_write(UMP_LOG_BASE+1, 20)) в текущей последовательности операций. */
CHECK(ump_log_write(UMP_LOG_BASE+1, 20));
/* Вызывает CHECK с аргументами (ump_log_write(UMP_LOG_BASE, 1)) в текущей последовательности операций. */
@@ -101,8 +85,8 @@ int main(void)
CHECK(ump_log_write(UMP_LOG_BASE, 1));
/* Вызывает CHECK с аргументами (ump_time == 1 && ump_archive_count == 7 && ump_generation == 2) в текущей последовательности операций. */
CHECK(ump_time == 1 && ump_archive_count == 7 && ump_generation == 2);
/* Вызывает CHECK с аргументами (ump_word(0, 0, 40) == 123) в текущей последовательности операций. */
CHECK(ump_word(0, 0, 40) == 123);
/* Вызывает CHECK с аргументами (ump_word(0, 0, 9) == 123) в текущей последовательности операций. */
CHECK(ump_word(0, 0, 9) == 123);
/* Завершает main и возвращает 0. */
return 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */

View File

@@ -60,10 +60,12 @@ __declspec(dllexport) int run_tests(void)
ump_log_can(0x8000U | 306U, 999, 0, 0); /* Not a one-based CAN address. */ /* Вызывает ump_log_can. Обновляет последние CAN-данные и напряжения для следующего снимка регистратора. */
/* Вызывает CHECK с аргументами (ump_log_write(UMP_LOG_BASE, 1)) в текущей последовательности операций. */
CHECK(ump_log_write(UMP_LOG_BASE, 1));
/* Вызывает CHECK с аргументами (ump_word(0, 0, 40) == 123 && ump_word(0, 0, 41) == 789) в текущей последовательности операций. */
CHECK(ump_word(0, 0, 40) == 123 && ump_word(0, 0, 41) == 789);
/* Вызывает CHECK с аргументами (ump_word(0, 0, 9) == 123 && ump_word(0, 0, 10) == 789) в текущей последовательности операций. */
CHECK(ump_word(0, 0, 9) == 123 && ump_word(0, 0, 10) == 789);
/* Вызывает CHECK с аргументами (2UL * UMP_LOG_CAPACITY * UMP_LOG_WORDS <= LOG_PAGE_LEN) в текущей последовательности операций. */
CHECK(2UL * UMP_LOG_CAPACITY * UMP_LOG_WORDS <= LOG_PAGE_LEN);
/* Проверяет чётную ширину записи v4 и нулевой резерв, необходимый для пар слов CAN. */
CHECK(UMP_LOG_WORDS == 12 && ump_word(0, 0, 11) == 0);
/* Вызывает CHECK с аргументами (!ump_log_write(UMP_LOG_BASE, 1)) в текущей последовательности операций. */
CHECK(!ump_log_write(UMP_LOG_BASE, 1));
/* Вызывает CHECK с аргументами (!ump_log_write(UMP_LOG_BASE+1, 20)) в текущей последовательности операций. */
@@ -76,10 +78,10 @@ __declspec(dllexport) int run_tests(void)
CHECK(ump_word(0, 0, 0) == 901-UMP_LOG_CAPACITY);
/* Вызывает CHECK с аргументами (ump_word(0, UMP_LOG_CAPACITY-1, 0) == 900) в текущей последовательности операций. */
CHECK(ump_word(0, UMP_LOG_CAPACITY-1, 0) == 900);
/* Вызывает CHECK с аргументами (ump_word(0, 0, 8) == 1234) в текущей последовательности операций. */
CHECK(ump_word(0, 0, 8) == 1234);
/* Вызывает CHECK с аргументами (ump_word(0, 0, 24) == 6) в текущей последовательности операций. */
CHECK(ump_word(0, 0, 24) == 6);
/* Вызывает CHECK с аргументами (ump_word(0, 0, 6) == 160) в текущей последовательности операций. */
CHECK(ump_word(0, 0, 6) == 160);
/* Вызывает CHECK с аргументами (ump_word(0, 0, 7) == 6) в текущей последовательности операций. */
CHECK(ump_word(0, 0, 7) == 6);
/* Короткая CAN-команда должна остаться отдельным событием. */
/* Записывает modbus[127] значением 0x40; массив технологических регистров; слово int на C28x занимает 16 бит. */
modbus[127] = 0x40;
@@ -99,8 +101,8 @@ __declspec(dllexport) int run_tests(void)
CHECK(ump_post == UMP_POST_POINTS);
/* Вызывает CHECK с аргументами (ump_word(0, ump_count-1, 2) == 0x103) в текущей последовательности операций. */
CHECK(ump_word(0, ump_count-1, 2) == 0x103);
/* Вызывает CHECK с аргументами (ump_word(0, ump_count-1, 18) == 0x807F) в текущей последовательности операций. */
CHECK(ump_word(0, ump_count-1, 18) == 0x807F);
/* Вызывает CHECK с аргументами (ump_word(0, ump_count-1, 3) == 0x40) в текущей последовательности операций. */
CHECK(ump_word(0, ump_count-1, 3) == 0x40);
/* Цикл for (i=0; i<UMP_POST_POINTS-1; i++) ump_log_tick();; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i=0; i<UMP_POST_POINTS-1; i++) ump_log_tick();
/* Вызывает CHECK с аргументами (ump_generation == 0) в текущей последовательности операций. */
@@ -117,16 +119,16 @@ __declspec(dllexport) int run_tests(void)
CHECK(ump_word(1, UMP_LOG_CAPACITY-1, 2) == 5);
/* Вызывает CHECK с аргументами (ump_count == 0 && ump_state == 1) в текущей последовательности операций. */
CHECK(ump_count == 0 && ump_state == 1);
/* Вызывает CHECK с аргументами (ump_word(1, UMP_LOG_CAPACITY-1, 40) == 123) в текущей последовательности операций. */
CHECK(ump_word(1, UMP_LOG_CAPACITY-1, 40) == 123);
/* Вызывает CHECK с аргументами (ump_word(1, UMP_LOG_CAPACITY-1, 41) == 789) в текущей последовательности операций. */
CHECK(ump_word(1, UMP_LOG_CAPACITY-1, 41) == 789);
/* Вызывает CHECK с аргументами (ump_word(1, UMP_LOG_CAPACITY-1, 9) == 123) в текущей последовательности операций. */
CHECK(ump_word(1, UMP_LOG_CAPACITY-1, 9) == 123);
/* Вызывает CHECK с аргументами (ump_word(1, UMP_LOG_CAPACITY-1, 10) == 789) в текущей последовательности операций. */
CHECK(ump_word(1, UMP_LOG_CAPACITY-1, 10) == 789);
/* Вызывает ump_log_can. Обновляет последние CAN-данные и напряжения для следующего снимка регистратора. */
ump_log_can(0x8000U | 305U, 999, 0, 0);
/* Вызывает CHECK с аргументами (ump_word(0, ump_count-1, 40) == 999) в текущей последовательности операций. */
CHECK(ump_word(0, ump_count-1, 40) == 999);
/* Вызывает CHECK с аргументами (ump_word(1, UMP_LOG_CAPACITY-1, 40) == 123) в текущей последовательности операций. */
CHECK(ump_word(1, UMP_LOG_CAPACITY-1, 40) == 123);
/* Вызывает CHECK с аргументами (ump_word(0, ump_count-1, 9) == 999) в текущей последовательности операций. */
CHECK(ump_word(0, ump_count-1, 9) == 999);
/* Вызывает CHECK с аргументами (ump_word(1, UMP_LOG_CAPACITY-1, 9) == 123) в текущей последовательности операций. */
CHECK(ump_word(1, UMP_LOG_CAPACITY-1, 9) == 123);
/* Записывает generation значением ump_generation; данные generation. */
generation = ump_generation;
/* Записывает archived значением ump_word(1, UMP_LOG_CAPACITY-1, 0); данные archived. */
@@ -265,8 +267,8 @@ __declspec(dllexport) int run_tests(void)
* Запись по старым технологическим адресам через сервис запрещена. */
/* Записывает length значением ump_can_prepare(3, UMP_LOG_BASE, 16, reply, &error); длина. */
length = ump_can_prepare(3, UMP_LOG_BASE, 16, reply, &error);
/* Вызывает CHECK с аргументами (!error && length == 16 && reply[0] == 0x554D && reply[1] == 3) в текущей последовательности операций. */
CHECK(!error && length == 16 && reply[0] == 0x554D && reply[1] == 3);
/* Вызывает CHECK с аргументами (!error && length == 16 && reply[0] == 0x554D && reply[1] == 4) в текущей последовательности операций. */
CHECK(!error && length == 16 && reply[0] == 0x554D && reply[1] == 4);
/* Записывает length значением ump_can_prepare(3, UMP_LOG_LIVE, 124, reply, &error); длина. */
length = ump_can_prepare(3, UMP_LOG_LIVE, 124, reply, &error);
/* Вызывает CHECK с аргументами (!error && length == 124) в текущей последовательности операций. */
@@ -275,14 +277,14 @@ __declspec(dllexport) int run_tests(void)
CHECK(reply[2] <= UMP_LOG_LIVE_RECORDS);
/* Цикл for (i=4+reply[2]*UMP_LOG_WORDS; i<124; i++) CHECK(reply[i] == 0);; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i=4+reply[2]*UMP_LOG_WORDS; i<124; i++) CHECK(reply[i] == 0);
/* Записывает length значением ump_can_prepare(3, UMP_LOG_DATA, 84, reply, &error); длина. */
length = ump_can_prepare(3, UMP_LOG_DATA, 84, reply, &error);
/* Вызывает CHECK с аргументами (!error && length == 84) в текущей последовательности операций. */
CHECK(!error && length == 84);
/* Записывает length значением ump_can_prepare(3, UMP_LOG_DATA, 42, reply, &error); длина. */
length = ump_can_prepare(3, UMP_LOG_DATA, 42, reply, &error);
/* Вызывает CHECK с аргументами (!error && length == 42) в текущей последовательности операций. */
CHECK(!error && length == 42);
/* Записывает length значением ump_can_prepare(3, UMP_LOG_DATA, 24, reply, &error); длина. */
length = ump_can_prepare(3, UMP_LOG_DATA, 24, reply, &error);
/* Вызывает CHECK с аргументами (!error && length == 24) в текущей последовательности операций. */
CHECK(!error && length == 24);
/* Записывает length значением ump_can_prepare(3, UMP_LOG_DATA, 12, reply, &error); длина. */
length = ump_can_prepare(3, UMP_LOG_DATA, 12, reply, &error);
/* Вызывает CHECK с аргументами (!error && length == 12) в текущей последовательности операций. */
CHECK(!error && length == 12);
/* Вызывает ump_can_prepare с аргументами (3, UMP_LOG_LIVE, 126, reply, &error) в текущей последовательности операций. */
ump_can_prepare(3, UMP_LOG_LIVE, 126, reply, &error);
/* Вызывает CHECK с аргументами (error == 2) в текущей последовательности операций. */