7月5日,华为创始人任正非接受法国著名新闻周刊《观点》专访。在长达15页的专访报道中,任正非谈到了许多问题,比如5G技术发展、中美关系、中欧关系和地缘政治等,其中还包括大家非常关注的鸿蒙系统。《观点》以“这个人将改变历史”为标题刊登了任正非的肖像照,并以长达15页的篇幅,对任正非本人以及华为进行了详细的专题报道,内容涉及了5G技术发展、中美关系、中欧关系以及地缘政治等问题。任正非在专访中介绍了自己的个人经历以及华为的发展历程和方向。同时,他就西方国家在华为与国家安全方面的担忧和质疑,做出了回应。
在专访中,任正非透露,华为自主研发的操作系统“鸿蒙”旨在应用于多种设备,这也证实了此前的传言。任正非表示:“我们正在研发的操作系统能够与印刷电路板、交换机、路由器、智能手机以及数据中心等兼容。”
对于鸿蒙系统,任正非表示,“该系统的处理延迟小于5毫秒。它将完美地适应物联网,还能够应用于自动驾驶。”任正非指出:“我们构建这个系统,为的是能够同步连接所有对象。这就是我们走向智能社会的方式。”
华为的鸿蒙操作系统为什么比安卓速度快60%?现在从程序角度去看:
-
就绪(Ready):
该任务在就绪列表中,只等待CPU。
-
运行(Running):
该任务正在执行。
-
阻塞(Blocked):
该任务不在就绪列表中。
包含任务被挂起、任务被延时、任务正在等待信号量、读写队列或者等待读写事件等。
{
UINTPTR uvIntSave;
LOS_TASK_CB *pstTaskCB;
UINT16 usTempStatus;
UINT32 uwErrRet = OS_ERROR;
if (uwTaskID > LOSCFG_BASE_CORE_TSK_LIMIT)
{
return LOS_ERRNO_TSK_ID_INVALID;
}
pstTaskCB = OS_TCB_FROM_TID(uwTaskID);
uvIntSave = LOS_IntLock();
usTempStatus = pstTaskCB->usTaskStatus;
if (OS_TASK_STATUS_UNUSED & usTempStatus)
{
uwErrRet = LOS_ERRNO_TSK_NOT_CREATED;
OS_GOTO_ERREND();
}
else if (!(OS_TASK_STATUS_SUSPEND & usTempStatus))
{
uwErrRet = LOS_ERRNO_TSK_NOT_SUSPENDED;
OS_GOTO_ERREND();
}
//以上为任务状态检查
pstTaskCB->usTaskStatus &= (~OS_TASK_STATUS_SUSPEND);//清除任务的suspend标志位置
if (!(OS_CHECK_TASK_BLOCK & pstTaskCB->usTaskStatus) )//若任务的还自在阻塞状态则变为就绪状态 ,并调用 LOS_Schedule()进行调度
{
pstTaskCB->usTaskStatus |= OS_TASK_STATUS_READY;
LOS_PriqueueEnqueue(&pstTaskCB->stPendList, pstTaskCB->usPriority);
if (g_bTaskScheduled)
{
(VOID)LOS_IntRestore(uvIntSave);
LOS_Schedule();
return LOS_OK;
}
g_stLosTask.pstNewTask = LOS_DL_LIST_ENTRY(LOS_PriqueueTop(), LOS_TASK_CB, stPendList); /*lint !e413*/
}
(VOID)LOS_IntRestore(uvIntSave);
return LOS_OK;
LOS_ERREND:
(VOID)LOS_IntRestore(uvIntSave);
return uwErrRet;
}
-
任务合法性(TaskId)及任务状态校验:判断任务序号以及任务当前状态是否确实为挂起。
-
改变任务状态:将任务的suspend状态位清掉
-
起用任务调度:如果任务被阻塞,则调起LOS_Schedule进行调度。
-
初始化任务队列
-
加入任务
-
循环处理任务
-
销毁任务队列
SSchedMsg msg;
SSchedQueue *pSched = (SSchedQueue *)param;
while (1) {
if (sem_wait(&pSched->fullSem) != 0) {
pError("wait %s fullSem failed, errno:%d, reason:%s", pSched->label, errno, strerror(errno));
if (errno == EINTR) {
/* sem_wait is interrupted by interrupt, ignore and continue */
continue;
}
}
if (pthread_mutex_lock(&pSched->queueMutex) != 0)
pError("lock %s queueMutex failed, reason:%s", pSched->label, strerror(errno));
msg = pSched->queue[pSched->fullSlot];
memset(pSched->queue + pSched->fullSlot, 0, sizeof(SSchedMsg));
pSched->fullSlot = (pSched->fullSlot + 1) % pSched->queueSize;//从队尾取出消息不断处理
if (pthread_mutex_unlock(&pSched->queueMutex) != 0)
pError("unlock %s queueMutex failed, reason:%s\n", pSched->label, strerror(errno));
if (sem_post(&pSched->emptySem) != 0)
pError("post %s emptySem failed, reason:%s\n", pSched->label, strerror(errno));
if (msg.fp)
(*(msg.fp))(&msg);
else if (msg.tfp)
(*(msg.tfp))(msg.ahandle, msg.thandle);
}
}
int taosScheduleTask(void *qhandle, SSchedMsg *pMsg) {
SSchedQueue *pSched = (SSchedQueue *)qhandle;
if (pSched == NULL) {
pError("sched is not ready, msg:%p is dropped", pMsg);
return 0;
}
if (sem_wait(&pSched->emptySem) != 0) pError("wait %s emptySem failed, reason:%s", pSched->label, strerror(errno));
if (pthread_mutex_lock(&pSched->queueMutex) != 0)
pError("lock %s queueMutex failed, reason:%s", pSched->label, strerror(errno));
pSched->queue[pSched->emptySlot] = *pMsg;
pSched->emptySlot = (pSched->emptySlot + 1) % pSched->queueSize;
if (pthread_mutex_unlock(&pSched->queueMutex) != 0)
pError("unlock %s queueMutex failed, reason:%s", pSched->label, strerror(errno));
if (sem_post(&pSched->fullSem) != 0) pError("post %s fullSem failed, reason:%s", pSched->label, strerror(errno));
return 0;
}
-
软件定时器是系统资源,在模块初始化的时候已经分配了一块连续的内存,系统支持的最大定时器个数可以在los_config.h文件中配置。
-
软件定时器使用了系统的一个队列和任务资源,软件定时器的触发遵循队列规则,先进先出。
定时时间短的定时器总是比定时时间长的靠近队列头,满足优先被触发的准则。
-
软件定时器以Tick为基本计时单位,当用户创建并启动一个软件定时器时,Huawei LiteOS会根据当前系统Tick时间及用户设置的定时间隔确定该定时器的到期Tick时间,并将该定时器控制结构挂入计时全局链表。
-
当Tick中断到来时,在Tick中断处理函数中扫描软件定时器的计时全局链表,看是否有定时器超时,若有则将超时的定时器记录下来。
-
Tick处理结束后,软件定时器任务(优先级为最高)被唤醒,在该任务中调用之前记录下来的超时定时器的处理函数。
-
首先明确鸿蒙的定时器是为了节省硬件定时器资源而设计的。
由于硬件定时器往往数量有限而系统实际运行中,对于定时器的需求往往高于硬件定时器的数量,所以操作系统都会实现软件定时器以满足用户需求。
-
先启动硬件定时器,注册硬件定时器的tick事件,也就是硬件定时器到时发生tick时会调用软件定时器的处理函数。
-
将在同一时刻到期的timer放在同一链表中。
-
在硬件产生tick事件时,取出当时到期的定时器列表,并顺序调起链表内所有到时定时器的处理函数。
{
SWTMR_HANDLER_ITEM_P pstSwtmrHandle = (SWTMR_HANDLER_ITEM_P)NULL;
SWTMR_HANDLER_ITEM_S stSwtmrHandle;
UINT32 uwRet;
for ( ; ; )
{
uwRet = LOS_QueueRead(m_uwSwTmrHandlerQueue, &pstSwtmrHandle, sizeof(SWTMR_HANDLER_ITEM_P), LOS_WAIT_FOREVER);
if (uwRet == LOS_OK)
{
if (pstSwtmrHandle != NULL)
{
stSwtmrHandle.pfnHandler = pstSwtmrHandle->pfnHandler;
stSwtmrHandle.uwArg = pstSwtmrHandle->uwArg;
(VOID)LOS_MemboxFree(m_aucSwTmrHandlerPool, pstSwtmrHandle);
if (stSwtmrHandle.pfnHandler != NULL)
{
stSwtmrHandle.pfnHandler(stSwtmrHandle.uwArg);
}
}
}
}//end of for
}
以上函数的运行原理动画解析如下:
(本文由中国计算网总编栾玲编辑录入《超算AI数据库》 转载请注明出处)
相关新闻焦点
计算头条:e-works黄培李培根参加2019工业APP创新应用大赛
计算头条:CB Insights发布全球人工智能100强企业名单与25大趋势
计算头条:苹果公司开始竞争音乐算法平台Festicket公司
微信关注公众号“cncompute_com ”,为您奉上最新最热的计算头条资讯,干货满满。