51 lines
2.2 KiB
C
51 lines
2.2 KiB
C
/**
|
||
* @file log_to_mem.c
|
||
* @brief Кольцевой журнал событий во внешней области памяти.
|
||
*
|
||
* Резервирует секцию .logg, хранит границы и текущий адрес журнала и очищает
|
||
* всю отведённую область по запросу. LOG_PAGE_START/LOG_PAGE_LEN должны
|
||
* соответствовать linker command file; clear_mem() выполняет длительную
|
||
* блокирующую запись и не предназначена для вызова из обработчика прерывания.
|
||
*/
|
||
/****************************************************************/
|
||
/* TMS320C32 */
|
||
/* ====== BIOS, КЛАИН, КЛВСП ====== */
|
||
/* ЦНИИ СЭТ (с) 1998-2001г. */
|
||
/****************************************************************/
|
||
/* log_to_mem.c
|
||
****************************************************************
|
||
* Запись логов в памyть *
|
||
****************************************************************/
|
||
|
||
#include "log_to_mem.h"
|
||
|
||
int no_write = 0,
|
||
never_write = 0; // Флаги, чтобы не писать (если что)
|
||
|
||
#pragma DATA_SECTION(logs_block,".logg");
|
||
unsigned int logs_block[0xFA00];
|
||
|
||
LOG Log;
|
||
unsigned int flog=0;
|
||
|
||
// Очищение памати, где логи лежат
|
||
/**
|
||
* @brief Сбрасывает метаданные и физически очищает всю область журнала.
|
||
* @post Log.Adres установлен в LOG_PAGE_START, Log.Circl сброшен, а каждое
|
||
* слово выделенной области равно нулю.
|
||
* @warning Функция блокируется на LOG_PAGE_LEN операций внешней памяти.
|
||
*/
|
||
void clear_mem()
|
||
{
|
||
unsigned long i;
|
||
|
||
Log.Start = LOG_PAGE_START;
|
||
Log.Finis = LOG_PAGE_START + LOG_PAGE_LEN;
|
||
Log.Adres = Log.Start;
|
||
Log.Circl = 0;
|
||
|
||
/* Полуинтервал [Start, Finis) исключает запись за последним словом секции. */
|
||
for (i=Log.Start; i<Log.Finis; i++)
|
||
*(volatile int *)i = 0;
|
||
}
|