1
0
mirror of https://github.com/NevermindZZT/letter-shell.git synced 2025-01-21 10:02:54 +08:00

新增 log组件适配shell锁

This commit is contained in:
Letter 2021-05-09 21:24:22 +08:00
parent 2c7ce324a6
commit d8ea842719
3 changed files with 72 additions and 11 deletions

View File

@ -31,6 +31,7 @@
- [尾行模式](#尾行模式) - [尾行模式](#尾行模式)
- [建议终端软件](#建议终端软件) - [建议终端软件](#建议终端软件)
- [命令遍历工具](#命令遍历工具) - [命令遍历工具](#命令遍历工具)
- [x86 demo](#x86-demo)
## 简介 ## 简介
@ -480,7 +481,7 @@ p1, SHELL_PARAM_FLOAT(p2), p3, SHELL_PARAM_FLOAT(p4));
## 权限系统说明 ## 权限系统说明
letter shell 3.x的权限管理同用户定义紧密相关letter shell 3.x使用8个bit位表示命令权限当用户和命令的权限按位与为真或者命令权限为0时表示该用户拥有此命令的权限可以调用命令 letter shell 3.x的权限管理同用户定义紧密相关letter shell 3.x使用8个bit位表示命令权限当用户和命令的权限按位与为真或者命令权限为0时表示该用户拥有此命令的权限可以调用命令
## 锁说明 ## 锁说明
@ -551,3 +552,14 @@ python shellTools.py project
``` ```
注意shellTools会遍历指定目录中所有文件所以当工程中文件较多时速度会比较慢建议只用于遍历用户模块的目录 注意shellTools会遍历指定目录中所有文件所以当工程中文件较多时速度会比较慢建议只用于遍历用户模块的目录
## x86 demo
letter shell 3.x提供了一个x86的demo可以直接编译运行其中包含了一条按键键值测试命令可以测试按键键值用于快捷键的定义编译运行方法如下
```sh
mv src/shell_cfg.h src/shell_cfg.h.bak
cd demo/x86-gcc/
make
./build/out
```

View File

@ -16,10 +16,11 @@
#if LOG_USING_COLOR == 1 #if LOG_USING_COLOR == 1
#define memPrintHead CSI(31) \ #define memPrintHead CSI(31) \
" Offset: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F" \ " Offset: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F" \
CSI(39) CSI(39) \
"\r\n"
#define memPrintAddr CSI(31)"0x%08x: "CSI(39) #define memPrintAddr CSI(31)"0x%08x: "CSI(39)
#else #else
#define memPrintHead " Offset: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F" #define memPrintHead " Offset: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\r\n"
#define memPrintAddr "0x%08x: " #define memPrintAddr "0x%08x: "
#endif #endif
@ -92,7 +93,7 @@ logSetLevel, logSetLevel, set log level);
* @param buffer buffer * @param buffer buffer
* @param len buffer长度 * @param len buffer长度
*/ */
void logWriteBuffer(Log *log, LogLevel level, char *buffer, short len) static void logWriteBuffer(Log *log, LogLevel level, char *buffer, short len)
{ {
if (log == LOG_ALL_OBJ) if (log == LOG_ALL_OBJ)
{ {
@ -125,11 +126,25 @@ void logWrite(Log *log, LogLevel level, char *fmt, ...)
va_list vargs; va_list vargs;
short len; short len;
#if SHELL_USING_LOCK == 1
if (log->shell)
{
SHELL_LOCK(log->shell);
}
#endif /* SHELL_USING_LOCK == 1 */
va_start(vargs, fmt); va_start(vargs, fmt);
len = vsnprintf(logBuffer, LOG_BUFFER_SIZE - 1, fmt, vargs); len = vsnprintf(logBuffer, LOG_BUFFER_SIZE - 1, fmt, vargs);
va_end(vargs); va_end(vargs);
logWriteBuffer(log, level, logBuffer, len); logWriteBuffer(log, level, logBuffer, len);
#if SHELL_USING_LOCK == 1
if (log->shell)
{
SHELL_UNLOCK(log->shell);
}
#endif /* SHELL_USING_LOCK == 1 */
} }
@ -137,27 +152,45 @@ void logWrite(Log *log, LogLevel level, char *fmt, ...)
* @brief 16 * @brief 16
* *
* @param log log对象 * @param log log对象
* @param level
* @param base * @param base
* @param length * @param length
*/ */
void logHexDump(Log *log, void *base, unsigned int length) void logHexDump(Log *log, LogLevel level, void *base, unsigned int length)
{ {
unsigned char *address; unsigned char *address;
unsigned int len = length; unsigned int len;
unsigned int printLen = 0; unsigned int printLen = 0;
unsigned char buf[12];
if (length == 0) if (length == 0 || log->level < level)
{ {
return; return;
} }
logWrite(log, LOG_NONE, "memory of 0x%08x, size: %d:\r\n", (unsigned int)base, length); #if SHELL_USING_LOCK == 1
if (log->shell)
{
SHELL_LOCK(log->shell);
}
#endif /* SHELL_USING_LOCK == 1 */
logWriteBuffer(log, LOG_NONE, "memory of 0x", sizeof("memory of 0x"));
len = vsnprintf(buf, 11, "08x", (unsigned int)base);
logWriteBuffer(log, LOG_NONE, buf, len);
logWriteBuffer(log, LOG_NONE, ", size: ", sizeof(", size: "));
len = vsnprintf(buf, 11, "%d", length);
logWriteBuffer(log, LOG_NONE, buf, len);
logWriteBuffer(log, LOG_NONE, ":\r\n", sizeof(":\r\n"));
address = (unsigned char *)((unsigned int)base & (~0x0000000F)); address = (unsigned char *)((unsigned int)base & (~0x0000000F));
length += (unsigned int)base - (unsigned int)address; length += (unsigned int)base - (unsigned int)address;
length = (length + 15) & (~0x0000000F); length = (length + 15) & (~0x0000000F);
logWrite(log, LOG_NONE, memPrintHead"\r\n"); logWriteBuffer(log, LOG_NONE, memPrintHead, sizeof(memPrintHead));
len = length;
while (length) while (length)
{ {
@ -205,10 +238,17 @@ void logHexDump(Log *log, void *base, unsigned int length)
length -= 16; length -= 16;
printLen = 0; printLen = 0;
} }
#if SHELL_USING_LOCK == 1
if (log->shell)
{
SHELL_UNLOCK(log->shell);
}
#endif /* SHELL_USING_LOCK == 1 */
} }
SHELL_EXPORT_CMD( SHELL_EXPORT_CMD(
SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_DISABLE_RETURN, SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_DISABLE_RETURN,
hexdump, logHexDump, hex dump\r\n hexdump [log] [base] [len]); hexdump, logHexDump, hex dump\r\n hexdump [log] [level] [base] [len]);
#if SHELL_USING_COMPANION == 1 #if SHELL_USING_COMPANION == 1
void logSwitchLevel(Shell *shell) void logSwitchLevel(Shell *shell)

View File

@ -182,10 +182,19 @@ typedef struct
action; \ action; \
} }
/**
* @brief 16
*
* @param base
* @param length
*/
#define logHexDumpAll(base, length) \
logHexDump(LOG_ALL_OBJ, LOG_ALL, base, length)
void logRegister(Log *log, Shell *shell); void logRegister(Log *log, Shell *shell);
void logUnRegister(Log *log); void logUnRegister(Log *log);
void logSetLevel(Log *log, LogLevel level); void logSetLevel(Log *log, LogLevel level);
void logWrite(Log *log, LogLevel level, char *fmt, ...); void logWrite(Log *log, LogLevel level, char *fmt, ...);
void logHexDump(Log *log, void *base, unsigned int length); void logHexDump(Log *log, LogLevel level, void *base, unsigned int length);
#endif #endif