diff --git a/apps/shell/src/shmsg.c b/apps/shell/src/shmsg.c index 6ab65832d5da585194c0e6fb9ed4d2e7a510fdd2..5d11f410bcdc112fd5ca061092791263fa895f4c 100644 --- a/apps/shell/src/shmsg.c +++ b/apps/shell/src/shmsg.c @@ -66,7 +66,7 @@ char *GetCmdline(ShellCB *shellCB) return cmdNode->cmdString; } - +//保存 cmd 历史记录 static void ShellSaveHistoryCmd(char *string, ShellCB *shellCB) { CmdKeyLink *cmdHistory = shellCB->cmdHistoryKeyLink; diff --git a/compat/posix/src/mqueue.c b/compat/posix/src/mqueue.c index e9d3ba4e68ea7b93314c54d66ea528cbd554b77a..42130adb4185e68c5a7100956eb7a13f01926fc2 100644 --- a/compat/posix/src/mqueue.c +++ b/compat/posix/src/mqueue.c @@ -234,7 +234,7 @@ STATIC struct mqpersonal *DoMqueueOpen(struct mqarray *mqueueCB, INT32 openFlag) ERROUT: return (struct mqpersonal *)-1; } -//创建或打开 posix 消息队列 +//posix ipc 标准接口之 创建或打开消息队列,参数是可变参数 mqd_t mq_open(const char *mqName, int openFlag, ...) { struct mqarray *mqueueCB = NULL; @@ -242,29 +242,29 @@ mqd_t mq_open(const char *mqName, int openFlag, ...) struct mq_attr *attr = NULL; struct mq_attr defaultAttr = { 0, MQ_MAX_MSG_NUM, MQ_MAX_MSG_LEN, 0 }; int retVal; - va_list ap; + va_list ap;//一个字符指针,可以理解为指向当前参数的一个指针,取参必须通过这个指针进行 if (MqNameCheck(mqName) == -1) { return (mqd_t)-1; } (VOID)pthread_mutex_lock(&g_mqueueMutex); - mqueueCB = GetMqueueCBByName(mqName); - if ((UINT32)openFlag & (UINT32)O_CREAT) { + mqueueCB = GetMqueueCBByName(mqName);//通过名称获取队列控制块 + if ((UINT32)openFlag & (UINT32)O_CREAT) {//需要创建了队列的情况 if (mqueueCB != NULL) { - if (((UINT32)openFlag & (UINT32)O_EXCL)) { + if (((UINT32)openFlag & (UINT32)O_EXCL)) {//已经在执行 errno = EEXIST; goto OUT; } - privateMqPersonal = DoMqueueOpen(mqueueCB, openFlag); - } else { - va_start(ap, openFlag); - (VOID)va_arg(ap, int); - attr = va_arg(ap, struct mq_attr *); - va_end(ap); + privateMqPersonal = DoMqueueOpen(mqueueCB, openFlag);//打开队列 + } else {//可变参数的实现 函数参数是以数据结构:栈的形式存取,从右至左入栈。 + va_start(ap, openFlag);//对ap进行初始化,让它指向可变参数表里面的第一个参数,va_start第一个参数是 ap 本身,第二个参数是在变参表前面紧挨着的一个变量,即“...”之前的那个参数 + (VOID)va_arg(ap, int);//获取int参数,调用va_arg,它的第一个参数是ap,第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值,并且把 ap 的位置指向变参表的下一个变量位置 + attr = va_arg(ap, struct mq_attr *);//获取mq_attr参数,调用va_arg,它的第一个参数是ap,第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值,并且把 ap 的位置指向变参表的下一个变量位置 + va_end(ap);//获取所有的参数之后,将这个 ap 指针关掉,以免发生危险,方法是调用 va_end,它将输入的参数 ap 置为 NULL if (attr != NULL) { - retVal = LOS_ArchCopyFromUser(&defaultAttr, attr, sizeof(struct mq_attr)); + retVal = LOS_ArchCopyFromUser(&defaultAttr, attr, sizeof(struct mq_attr));//从用户区拷贝到内核区 if (retVal != 0) { errno = EFAULT; goto OUT; @@ -275,14 +275,14 @@ mqd_t mq_open(const char *mqName, int openFlag, ...) goto OUT; } } - privateMqPersonal = DoMqueueCreate(&defaultAttr, mqName, openFlag); + privateMqPersonal = DoMqueueCreate(&defaultAttr, mqName, openFlag);//创建队列 } - } else { - if (mqueueCB == NULL) { + } else {//已经创建了队列 + if (mqueueCB == NULL) {// errno = ENOENT; goto OUT; } - privateMqPersonal = DoMqueueOpen(mqueueCB, openFlag); + privateMqPersonal = DoMqueueOpen(mqueueCB, openFlag);//直接打开队列 } OUT: @@ -452,7 +452,7 @@ ERROUT_UNLOCK: (VOID)pthread_mutex_unlock(&g_mqueueMutex); return -1; } - +//把时间转成 节拍 STATIC INT32 ConvertTimeout(long flags, const struct timespec *absTimeout, UINT64 *ticks) { if ((UINT32)flags & (UINT32)FNONBLOCK) { @@ -498,6 +498,7 @@ STATIC INLINE BOOL MqParamCheck(mqd_t personal, const char *msg, size_t msgLen) errno = errcode; \ goto ERROUT; \ } +//posix ipc 标准接口之 定时发送消息 msgPrio为消息发送的优先级,目前尚未支持优先级的发送 int mq_timedsend(mqd_t personal, const char *msg, size_t msgLen, unsigned int msgPrio, const struct timespec *absTimeout) { @@ -506,36 +507,36 @@ int mq_timedsend(mqd_t personal, const char *msg, size_t msgLen, unsigned int ms struct mqarray *mqueueCB = NULL; struct mqpersonal *privateMqPersonal = NULL; - OS_MQ_GOTO_ERROUT_IF(!MqParamCheck(personal, msg, msgLen), errno); + OS_MQ_GOTO_ERROUT_IF(!MqParamCheck(personal, msg, msgLen), errno);//参数异常处理 - OS_MQ_GOTO_ERROUT_IF(msgPrio > (MQ_PRIO_MAX - 1), EINVAL); + OS_MQ_GOTO_ERROUT_IF(msgPrio > (MQ_PRIO_MAX - 1), EINVAL);//优先级异常处理,鸿蒙目前只支持 msgPrio <= 0 - (VOID)pthread_mutex_lock(&g_mqueueMutex); + (VOID)pthread_mutex_lock(&g_mqueueMutex);//临界区拿锁操作 privateMqPersonal = (struct mqpersonal *)personal; - OS_MQ_GOTO_ERROUT_UNLOCK_IF(privateMqPersonal->mq_status != MQ_USE_MAGIC, EBADF); + OS_MQ_GOTO_ERROUT_UNLOCK_IF(privateMqPersonal->mq_status != MQ_USE_MAGIC, EBADF);//魔法数字异常处理 mqueueCB = privateMqPersonal->mq_posixdes; - OS_MQ_GOTO_ERROUT_UNLOCK_IF(msgLen > (size_t)(mqueueCB->mqcb->queueSize - sizeof(UINT32)), EMSGSIZE); + OS_MQ_GOTO_ERROUT_UNLOCK_IF(msgLen > (size_t)(mqueueCB->mqcb->queueSize - sizeof(UINT32)), EMSGSIZE);//消息长度异常处理 OS_MQ_GOTO_ERROUT_UNLOCK_IF((((UINT32)privateMqPersonal->mq_flags & (UINT32)O_WRONLY) != (UINT32)O_WRONLY) && (((UINT32)privateMqPersonal->mq_flags & (UINT32)O_RDWR) != (UINT32)O_RDWR), - EBADF); + EBADF);//消息标识异常,必须有只读而且是可读可写标签 - OS_MQ_GOTO_ERROUT_UNLOCK_IF(ConvertTimeout(privateMqPersonal->mq_flags, absTimeout, &absTicks) == -1, errno); - mqueueID = mqueueCB->mq_id; + OS_MQ_GOTO_ERROUT_UNLOCK_IF(ConvertTimeout(privateMqPersonal->mq_flags, absTimeout, &absTicks) == -1, errno);//时间转换成tick 处理 + mqueueID = mqueueCB->mq_id;//记录消息队列ID (VOID)pthread_mutex_unlock(&g_mqueueMutex); - err = LOS_QueueWriteCopy(mqueueID, (VOID *)msg, (UINT32)msgLen, (UINT32)absTicks); + err = LOS_QueueWriteCopy(mqueueID, (VOID *)msg, (UINT32)msgLen, (UINT32)absTicks);//拷贝消息内容到内核空间 if (map_errno(err) != ENOERR) { goto ERROUT; } return 0; ERROUT_UNLOCK: - (VOID)pthread_mutex_unlock(&g_mqueueMutex); + (VOID)pthread_mutex_unlock(&g_mqueueMutex);//释放锁 ERROUT: return -1; } - +//定时接收消息 ssize_t mq_timedreceive(mqd_t personal, char *msg, size_t msgLen, unsigned int *msgPrio, const struct timespec *absTimeout) { diff --git a/fs/vfs/vfs_cmd/vfs_shellcmd.c b/fs/vfs/vfs_cmd/vfs_shellcmd.c index a8c5b6efc0075dd88eb2d11ba239b078858e75fd..1fb6f5b34fc9fd35c631e37046c9d8af66aa3164 100644 --- a/fs/vfs/vfs_cmd/vfs_shellcmd.c +++ b/fs/vfs/vfs_cmd/vfs_shellcmd.c @@ -1608,7 +1608,7 @@ int osShellCmdChmod(int argc, const char **argv) p = argv[0]; while (p[i]) { - if ((p[i] <= '7') && (p[i] >= '0')) + if ((p[i] <= '7') && (p[i] >= '0'))// 只能在 000 - 777 之间 { mode = (mode << MODE_BIT) | (p[i] - '0'); } @@ -1621,7 +1621,7 @@ int osShellCmdChmod(int argc, const char **argv) } filename = argv[1]; - shell_working_directory = OsShellGetWorkingDirtectory(); + shell_working_directory = OsShellGetWorkingDirtectory();//获取当前工作目录 if (shell_working_directory == NULL) { return -1; diff --git a/shell/full/include/shcmd.h b/shell/full/include/shcmd.h index 7392a8b2959a73b597eb42794c59173f8de6f3ea..b8538c3922cef7fd66666869a63b7abdd959b0b3 100644 --- a/shell/full/include/shcmd.h +++ b/shell/full/include/shcmd.h @@ -72,8 +72,8 @@ typedef struct { } CmdModInfo; typedef struct { - UINT32 count; - LOS_DL_LIST list; + UINT32 count;//数量 + LOS_DL_LIST list;//链表 CHAR cmdString[0]; } CmdKeyLink; diff --git a/shell/full/include/shell.h b/shell/full/include/shell.h index 31e711aa8eb53a31866ef06949353193fe5402f8..becf6c4234fcdba9dfe95e7f16fedf0c0c2e34a8 100644 --- a/shell/full/include/shell.h +++ b/shell/full/include/shell.h @@ -64,10 +64,10 @@ extern "C" { #define CMD_KEY_LEN 16U #define CMD_MAX_LEN (256U + CMD_KEY_LEN) //256+16 = 272 #define CMD_KEY_NUM 32 -#define CMD_HISTORY_LEN 10 -#define CMD_MAX_PATH 256 -#define DEFAULT_SCREEN_WIDTH 80 -#define DEFAULT_SCREEN_HEIGNT 24 +#define CMD_HISTORY_LEN 10 //记录历史记录的长度 +#define CMD_MAX_PATH 256 //cmd 命令的最大路径 +#define DEFAULT_SCREEN_WIDTH 80 //默认的屏幕宽度 +#define DEFAULT_SCREEN_HEIGNT 24 //默认的屏幕高度 #define SHELL_MODE 0 #define OTHER_MODE 1 @@ -96,7 +96,7 @@ typedef struct { pthread_mutex_t keyMutex; //键盘输入互斥锁 pthread_mutex_t historyMutex;//历史记录互斥锁 CHAR shellBuf[SHOW_MAX_LEN];//shell命令的最大长度 不能大于 272个字符 - CHAR shellWorkingDirectory[PATH_MAX]; + CHAR shellWorkingDirectory[PATH_MAX];//shell的工作目录 类似:pwd } ShellCB; /* All support cmd types *///所有支持的 CMD 类型 diff --git a/shell/full/src/base/show.c b/shell/full/src/base/show.c index d63a47cd6aec1baabf7073c3e80d813f46da5850..712d2cdc79e7b4921f2814e696e1fd2f3a6c3d8b 100644 --- a/shell/full/src/base/show.c +++ b/shell/full/src/base/show.c @@ -171,7 +171,7 @@ CHAR *OsShellGetWorkingDirtectory(VOID) if (shellCB == NULL) { return NULL; } - return shellCB->shellWorkingDirectory; + return shellCB->shellWorkingDirectory;//shell 控制块的工作目录 } #ifdef __cplusplus diff --git a/zzz/test/main.c b/zzz/test/main.c index bebae296fbbf95fd19e30107f92835268718a4a3..b6c41eb5b20c72a1d4fc599e710ad82dcd748bed 100644 --- a/zzz/test/main.c +++ b/zzz/test/main.c @@ -1,4 +1,6 @@ #include +#include + typedef unsigned int UINTPTR; typedef unsigned char UINT8; typedef unsigned long PTE_T; @@ -51,10 +53,31 @@ void round1(){ //printf("ROUNDUP %d\n",ROUNDUP(9, 2)); //printf("ROUNDDOWN %d\n",ROUNDDOWN(9, 2)); } - +void arg_test(int i, ...) +{ + int j=0,k=0; + va_list arg_ptr; + va_start(arg_ptr, i); + printf("&i = %p\n", &i);//打印参数i在堆栈中的地址 + printf("arg_ptr = %p\n", arg_ptr);//打印va_start之后arg_ptr地址 + printf("%d %d %d\n", i, j, k); + j=va_arg(arg_ptr, int); + printf("arg_ptr = %p\n", arg_ptr);//打印va_arg后arg_ptr的地址 + printf("%d %d %d\n", i, j, k); + printf("arg_ptr = %p\n", arg_ptr);//打印va_arg后arg_ptr的地址 + k=va_arg(arg_ptr, int); + printf("%d %d %d\n", i, j, k); + printf("arg_ptr = %p\n", arg_ptr);//打印va_arg后arg_ptr的地址 + /*这时arg_ptr应该比参数i的地址高sizeof(int)个字节,即指向下一个参数的地址,如果已经是最后一个参数,arg_ptr会为NULL*/ + va_end(arg_ptr); + printf("arg_ptr = %p\n", arg_ptr);//打印va_arg后arg_ptr的地址 + printf("%d %d\n", i, j); +} int main() { int size = 0; + printf("sizeof(int) %d\n",sizeof(int)); + arg_test(99, 4,8,9); size = sizeof(LOS_DL_LIST) << OS_TSK_SORTLINK_LOGLEN; printf("LOS_DL_LIST %d\n",sizeof(LOS_DL_LIST *)); printf("size %d\n",size); diff --git a/zzz/test/main.exe b/zzz/test/main.exe index 89c1d9a89fa3df11c694c14e30440e0db1079917..8cb3146b9386a481ad09d0f3944d5bf9c4384b23 100644 Binary files a/zzz/test/main.exe and b/zzz/test/main.exe differ