鸿蒙轻内核A核源码分析系列七 进程管理 (2)
往期知识点记录:
- 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总
- 轻内核A核源码分析系列一 数据结构-双向循环链表
- 轻内核A核源码分析系列二 数据结构-位图操作
- 轻内核A核源码分析系列三 物理内存(1)
- 轻内核A核源码分析系列三 物理内存(2)
- 轻内核A核源码分析系列四(1)虚拟内存进程空间编号
- 轻内核A核源码分析系列四(2) 虚拟内存
- 轻内核A核源码分析系列四(3) 虚拟内存
- 轻内核A核源码分析系列五 虚实映射(1)基础概念
- 轻内核A核源码分析系列五 虚实映射(2)虚实映射初始化
- 轻内核A核源码分析系列五 虚实映射(3)虚拟物理内存映射
- 轻内核A核源码分析系列五 虚实映射(5)虚实映射解除
- 轻内核A核源码分析系列五 虚实映射(6)虚拟映射修改转移
- 轻内核A核源码分析系列五 虚实映射(7)虚实映射Flag属性
- 轻内核A核源码分析系列六 MMU协处理器(1)
- 轻内核A核源码分析系列六 MMU协处理器(2)
- 轻内核A核源码分析系列七 进程管理 (1)
- 轻内核A核源码分析系列七 进程管理 (2)
- 轻内核A核源码分析系列七 进程管理 (3)
- 持续更新中……
本文先熟悉下进程管理的文件kernel\base\core\los_process.c中的内部接口,读读代码,做些记录。
1、LiteOS-A内核进程全局变量
⑴是进程池,存放各个进程控制块LosProcessCB的信息。⑵处开始的g_freeProcess是空闲进程链表,挂载各个空闲进程控制块;g_processRecycleList是待回收进程控制块链表,挂载各个等待回收的进程控制块。⑶处开始的g_userInitProcess是用户根进程的进程号,数值固定为1.,g_kernelInitProcess是内核进程,内核进程的进程号固定为2,g_kernelIdleProcess是内核空闲进程,进程号固定为0。⑷处开始的g_processMaxNum表示为配置的进程的最大数目,g_processGroup维护进程组信息,所有的进程组都会挂载这个全局进程组链表节点g_processGroup->groupList上。
⑴ LITE_OS_SEC_BSS LosProcessCB *g_processCBArray = NULL;
⑵ LITE_OS_SEC_DATA_INIT STATIC LOS_DL_LIST g_freeProcess;LITE_OS_SEC_DATA_INIT STATIC LOS_DL_LIST g_processRecycleList;
⑶ LITE_OS_SEC_BSS UINT32 g_userInitProcess = OS_INVALID_VALUE;LITE_OS_SEC_BSS UINT32 g_kernelInitProcess = OS_INVALID_VALUE;LITE_OS_SEC_BSS UINT32 g_kernelIdleProcess = OS_INVALID_VALUE;
⑷ LITE_OS_SEC_BSS UINT32 g_processMaxNum;LITE_OS_SEC_BSS ProcessGroup *g_processGroup = NULL;
2. 涉及空闲进程链表内部操作
空闲进程块链接操作涉及初始化OsProcessInit、插入空闲链接OsInsertPCBToFreeList、从链表获取空闲进程块OsGetFreePCB。我们先看下OsInsertPCBToFreeList和OsGetFreePCB。初始化链表在初始化进程时再看。
2.1 OsInsertPCBToFreeList
OsInsertPCBToFreeList函数会进程控制块插入到空闲进程块链表。函数比较简单,把进程结构体块清空,然后放入进程块链表。有个有意思的细节需要了解下。⑴处记录下进程号,然后把进程块置空。⑵处又把进程号设置给进程块结构体,进程号数量是固定的。⑶处开始设置进程为未使用状态,更新定时器编号未无效值,然后插入到空闲进程块链表。
STATIC INLINE VOID OsInsertPCBToFreeList(LosProcessCB *processCB){
⑴ UINT32 pid = processCB->processID;(VOID)memset_s(processCB, sizeof(LosProcessCB), 0, sizeof(LosProcessCB));
⑵ processCB->processID = pid;
⑶ processCB->processStatus = OS_PROCESS_FLAG_UNUSED;processCB->timerID = (timer_t)(UINTPTR)MAX_INVALID_TIMER_VID;LOS_ListTailInsert(&g_freeProcess, &processCB->pendList);}
2.2 OsGetFreePCB
OsGetFreePCB函数用于从空闲进程链表中获取进程块,该函数只有在开启LOSCFG_KERNEL_VM的时候才生效。⑴处当空闲进程链表为空时,返回NULL。⑵处获取空闲进程块指针,然后虫空闲进程块链表中删除。
STATIC LosProcessCB *OsGetFreePCB(VOID)
{LosProcessCB *processCB = NULL;UINT32 intSave;SCHEDULER_LOCK(intSave);
⑴ if (LOS_ListEmpty(&g_freeProcess)) {SCHEDULER_UNLOCK(intSave);PRINT_ERR("No idle PCB in the system!\n");return NULL;}⑵ processCB = OS_PCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&g_freeProcess));LOS_ListDelete(&processCB->pendList);SCHEDULER_UNLOCK(intSave);return processCB;
}
3. 涉及进程和线程的内部操作
该类操作包含把线程从进程中删除OsDeleteTaskFromProcess,还包括把线程包含进进程OsProcessAddNewTask。
3.1 OsDeleteTaskFromProcess
OsDeleteTaskFromProcess函数用于从进程中删除一个线程。⑴处可以看出每个线程/任务控制块都维护进程号,根据进程号可以获取进程控制块。每个线程控制块通过自己的成员变量threadList挂载到进程的线程链表上。⑵处从进程的线程链表上删除,然后把进程的线程数减去1。
⑶处把任务控制块插入到待回收链表上。
VOID OsDeleteTaskFromProcess(LosTaskCB *taskCB){
⑴ LosProcessCB *processCB = OS_PCB_FROM_PID(taskCB->processID);⑵ LOS_ListDelete(&taskCB->threadList);processCB->threadNumber--;
⑶ OsTaskInsertToRecycleList(taskCB);}
3.2 OsProcessAddNewTask
函数OsProcessAddNewTask把线程关联到进程上,需要两个参数,分别进程号和线程控制块。需要注意返回值,返回值表示,关联新线程之前的,进程的线程数量。⑴处获取进程块,⑵处把线程块关联的进程号设置为参数中输入的进程号,然后把线程控制块挂载到进程的线程链表上。可以看出,线程块的threadList用于挂载到进程的线程链表,进程块的threadSiblingList节点用于挂载本进程下的各种线程。⑶处如果是用户态进程,标记线程的状态为用户态线程。⑷如果进程的线程数目大于0,线程的基础优先级basePrio设置为和进程的主线程的优先级一样,否则设置为最大优先级。⑸如果是内核进程,线程的基础优先级设置为当前线程的优先级。⑹处如果开启了虚拟内存,设置线程的MMU结构体信息为进程虚拟地址空间中维护的MMU。⑺处如果进程的线程数为0,则把线程设置为进程的主线程。然后把进程的线程数加1。⑻处获得进程已有的线程数量,然后把进程的线程数量增加1。然后返回进程的关联新线程之前的线程数量。
UINT32 OsProcessAddNewTask(UINT32 pid, LosTaskCB *taskCB){UINT32 intSave;UINT16 numCount;
⑴ LosProcessCB *processCB = OS_PCB_FROM_PID(pid);SCHEDULER_LOCK(intSave);
⑵ taskCB->processID = pid;LOS_ListTailInsert(&(processCB->threadSiblingList), &(taskCB->threadList));⑶ if (OsProcessIsUserMode(processCB)) {taskCB->taskStatus |= OS_TASK_FLAG_USER_MODE;
⑷ if (processCB->threadNumber > 0) {taskCB->basePrio = OS_TCB_FROM_TID(processCB->threadGroupID)->basePrio;} else {taskCB->basePrio = OS_USER_PROCESS_PRIORITY_HIGHEST;}} else {
⑸ taskCB->basePrio = OsCurrTaskGet()->basePrio;}#ifdef LOSCFG_KERNEL_VM
⑹ taskCB->archMmu = (UINTPTR)&processCB->vmSpace->archMmu;#endifif (!processCB->threadNumber) {
⑺ processCB->threadGroupID = taskCB->taskID;}processCB->threadNumber++;⑻ numCount = processCB->threadCount;processCB->threadCount++;SCHEDULER_UNLOCK(intSave);return numCount;}
4、涉及进程组的内部操作
涉及进程组的内部操作包含进程组的创建OsCreateProcessGroup、进程组的退出OsExitProcessGroup、查找进程组OsExitProcessGroup。
4.1 OsCreateProcessGroup
OsCreateProcessGroup函数用于根据进程号创建进程组,返回值为创建的进程组指针。进程组是动态创建的,⑴处为进程组控制块申请动态内存。⑵处进程组的groupId即为创建进程组的进程号,接着初始化进程组的两个链表。⑶处获取进程控制块,然后执行⑷把进程挂载到进程组的processList进程链表上,使用的挂载点为进程控制块的subordinateGroupList链表节点,所以看到这个成员变量,要想起来是在同一个进程组的各个进程的链接关系。然后更新进程的进程组信息,并更新进程状态为进程组leader。⑸处如果存在全局进程组,则把创建的进程组挂载到全局进程组变量上。
STATIC ProcessGroup *OsCreateProcessGroup(UINT32 pid){LosProcessCB *processCB = NULL;
⑴ ProcessGroup *group = LOS_MemAlloc(m_aucSysMem1, sizeof(ProcessGroup));if (group == NULL) {return NULL;}⑵ group->groupID = pid;LOS_ListInit(&group->processList);LOS_ListInit(&group->exitProcessList);⑶ processCB = OS_PCB_FROM_PID(pid);
⑷ LOS_ListTailInsert(&group->processList, &processCB->subordinateGroupList);processCB->group = group;processCB->processStatus |= OS_PROCESS_FLAG_GROUP_LEADER;
⑸ if (g_processGroup != NULL) {LOS_ListTailInsert(&g_processGroup->groupList, &group->groupList);}return group;}
4.2 OsExitProcessGroup
OsExitProcessGroup函数用于把一个进程退出进程组,第一个参数指定进程控制块,第二个为输出参数,记录进程所在的进程组。⑴根据进程获取所在的进程组,然后获取进程组的主进程,然后获取主进程的进程控制块。⑵处把进程从进程组里删除。⑶处表示如果进程组下面没有挂载进程,并且进程组下面也没有挂载退出的进程,则执行⑷把进程组从全局进程组链表上删除。然后,把进程组的主进程的状态设置为非主进程OS_PROCESS_FLAG_GROUP_LEADER。⑸处如果主进程未使用状态并且主进程非退出状态,则把主进程从阻塞链表上删除,然后插入到空闲空闲进程链表上。⑹处既然进程推出了进程组,需要更新该进程的所属进程组为NULL。
STATIC VOID OsExitProcessGroup(LosProcessCB *processCB, ProcessGroup **group){
⑴ LosProcessCB *groupProcessCB = OS_PCB_FROM_PID(processCB->group->groupID);⑵ LOS_ListDelete(&processCB->subordinateGroupList);
⑶ if (LOS_ListEmpty(&processCB->group->processList) && LOS_ListEmpty(&processCB->group->exitProcessList)) {
⑷ LOS_ListDelete(&processCB->group->groupList);groupProcessCB->processStatus &= ~OS_PROCESS_FLAG_GROUP_LEADER;*group = processCB->group;
⑸ if (OsProcessIsUnused(groupProcessCB) && !(groupProcessCB->processStatus & OS_PROCESS_FLAG_EXIT)) {LOS_ListDelete(&groupProcessCB->pendList);OsInsertPCBToFreeList(groupProcessCB);}}⑹ processCB->group = NULL;}
4.3 OsFindProcessGroup
OsFindProcessGroup函数用于根据进程组编号获取进程组指针。⑴如果等于全局进程组的编号,则反正全局进程组指针。⑵处遍历全局进程组下面的各个进程组,判断遍历到的进程组的编号是否等于传入的进程组编号,如果相等则返回。如果执行到⑶,表明没有查询到指定的进程组编号的进程组信息。
STATIC ProcessGroup *OsFindProcessGroup(UINT32 gid){ProcessGroup *group = NULL;
⑴ if (g_processGroup->groupID == gid) {return g_processGroup;}⑵ LOS_DL_LIST_FOR_EACH_ENTRY(group, &g_processGroup->groupList, ProcessGroup, groupList) {if (group->groupID == gid) {return group;}}⑶ PRINT_INFO("%s is find group : %u failed!\n", __FUNCTION__, gid);return NULL;}
小结
本文介绍了进程管理的文件本文先熟悉下进程管理的文件kernel\base\core\los_process.c中的部分内部接口。
经常有很多小伙伴抱怨说:不知道学习鸿蒙开发哪些技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?
为了能够帮助到大家能够有规划的学习,这里特别整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。

《鸿蒙 (Harmony OS)开发学习手册》(共计892页):https://gitcode.com/HarmonyOS_MN/733GH/overview
如何快速入门?
1.基本概念
2.构建第一个ArkTS应用
3.……

开发基础知识:
1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……

基于ArkTS 开发
1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……

鸿蒙开发面试真题(含参考答案):https://gitcode.com/HarmonyOS_MN/733GH/overview

OpenHarmony 开发环境搭建

《OpenHarmony源码解析》:https://gitcode.com/HarmonyOS_MN/733GH/overview
- 搭建开发环境
- Windows 开发环境的搭建
- Ubuntu 开发环境搭建
- Linux 与 Windows 之间的文件共享
- ……
- 系统架构分析
- 构建子系统
- 启动流程
- 子系统
- 分布式任务调度子系统
- 分布式通信子系统
- 驱动子系统
- ……

OpenHarmony 设备开发学习手册:https://gitcode.com/HarmonyOS_MN/733GH/overview


相关文章:
鸿蒙轻内核A核源码分析系列七 进程管理 (2)
往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 轻内核A核源码分析系列一 数据结构-双向循环链表 轻内核A核源码分析系列二 数据结构-位图操作 轻内核A核源码分析系列三 物理内存(1࿰…...
关于TypeScript使用讲解
TypeScript讲解 安装环境 1.安装node js 配置环境变量 2.在终端中 运行 npm i -g typescript typescript: 用于编译ts代码 提供了 tsc命令 实现了将 TS>>>> JS转换 验证: tsc -v 编译并运行 TS代码 1.创建ts文件(TS文件为后缀名的文件࿰…...
C语言 | Leetcode C语言题解之第393题UTF-8编码验证
题目: 题解: static const int MASK1 1 << 7; static const int MASK2 (1 << 7) (1 << 6);bool isValid(int num) {return (num & MASK2) MASK1; }int getBytes(int num) {if ((num & MASK1) 0) {return 1;}int n 0;in…...
Netty权威指南:Netty总结-编解码与序列化
第四章 TCP粘包/拆包问题 4.1 TCP 粘包/拆包 TCP是流协议,也就是没有界限的的一串数据,底层并不知道上层业务数据的具体含义,也就是说一个完整的包可能会被拆分成多个包进行发送,也可能把几个小包封装成一个大的数据包发送。这就…...
FIDAVL:基于视觉语言模型的假图像检测与归因 !
FIDAVL:基于视觉语言模型的假图像检测与归因 ! 这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】 作者提出了FIDAVL:使用视觉语言模型进行虚假图像检测。FIDAVL是一…...
如何通过海外云手机提升运营效率
随着技术的不断进步,市场上出现了越来越多的提高跨国电商运营效率的应用,海外云手机就是其中一个。海外云手机的优势体现在多个方面,那么如何通过使用海外云手机来提升运营效率?可以从以下几个方面了解。 首先,海外云手…...
数据库4个范式的说明
在数据库设计中,范式(Normal Form)用于消除冗余和异常,确保数据一致性。以下是第一范式、第二范式、第三范式和BCNF(Boyce-Codd Normal Form,即第四范式)的示例说明: 1. 第一范式&a…...
Excel怎么截图?快速捕捉工作表的多种方法
大家好,这里是效率办公指南! 📸 在日常工作中,我们经常需要对Excel工作表进行截图,无论是为了记录数据、制作演示还是进行数据对比。今天,我们就来学习几种在Excel中截图的方法以及它们的快捷键。 一、使…...
MyBatis动态SQL标签总结、开发手册、高阶用法(动态SQL、OGNL、批量操作、片段重用、 SQL 组合、 执行优化、嵌套查询与延迟加载)
MyBatis提供了一个非常强大的动态SQL功能,它使用了一组XML标签来帮助我们根据不同条件生成动态SQL。动态SQL的设计让开发者可以根据业务需求,灵活地构建SQL查询语句。以下是MyBatis动态SQL标签的总结。 动态SQL标签说明特点<if>条件判断语句&…...
出处不详 取数游戏
目录 取数游戏题目描述背景输入输出数据范围 题解解法优化 打赏 取数游戏 题目描述 背景 两人将 n n n个正整数围成一个圆环,规则如下: 第一名玩家随意选取数字;第二名玩家从与第一名玩家相邻的两个数字中选择一个;而后依次在…...
拉取ros2_control_demos存储库
目录 克隆存储库 方法 1: 使用 git clone 和 rosdep 安装依赖 方法 2: 使用 vcs 工具管理多个存储库 区别总结 rosdep 和 APT 的关系 网络问题 安装依赖 克隆存储库 方法 1: 使用 git clone 和 rosdep 安装依赖 下载存储库: mkdir -p ~/ros2_ws/src cd ~/ros…...
Apache Doris Flink Connector 24.0.0 版本正式发布
亲爱的社区伙伴们,Apache Doris Flink Connector 24.0.0 版本已于 2024 年 9 月 5 日正式发布。该版本新增了对 Flink 1.20 的支持,并支持通过 Arrow Flight SQL 高速读取 Doris 中数据。此外,整库同步所依赖的 FlinkCDC,也需升级…...
语音控制小夜灯的实现方案介绍
语音控制小夜灯的实现方案组成部分 语音控制小夜灯的实现方案主要包括硬件组装和软件编程两个部分。 硬件组装涉及将语音声控模块、灯泡、USB连接线等组件正确连接。首先,使用螺丝刀和螺丝将四个隔离柱固定在底板四个拐角处,同时将语音声控模…...
万龙觉醒免费辅助:VMOS云手机辅助巴克尔阵容搭配攻略!
《万龙觉醒》是一款策略类手游,选择合适的英雄阵容搭配能够极大提升战斗效果。而借助VMOS云手机的辅助功能,玩家可以更加轻松地管理游戏进程,优化操作体验。以下是VMOS云手机的三大核心功能,帮助你更好地掌控《万龙觉醒》战局。 V…...
【English】长难句翻译
这里写目录标题 技巧知识点1. 定语从句 和 状从区别2. 定从 修饰词3. who 和 whom 区别4. 除了定从、状从,还有啥?5. 怎么在长难句快速定位到主谓宾而不被各种从句中的动词影响判断6. 没有,的那种一大堆从句连起来的长难句怎么办7. 时态怎么放在翻译里总结技巧 知识点 1. 定语…...
npm login 或者 npm publish 超时timeout
场景:空闲时间想自己尝试下npm发布包,毕竟这东西可以不用,但不能不会 步骤很简单 1.npm login 2.npm publish 这里有个坑。。。因为想发布到npm上,所以这里的镜像源要换回https://registry.npmjs.org,不能使用淘宝镜像…...
Python的openpyxl使用記錄(包含合併單元格,圖片下載和圖片插入,設置邊框,設置背景顏色)
背景 因為公司最近要求我做一份自動化導出報告,內容有點多,為了省事,我選用了python,後面估計要自建在線辦公系統,這個後續再講 需要的庫 openpyxl 和Pandas 開始 Execl導入 from openpyxl import load_workbook …...
基于springboot+vue实现的在线商城系统
系统主要功能: (1)商品管理模块:实现了商品的基本信息录入、图片上传、状态管理等相关功能。 (2)商品分类模块:实现了分类的增删改查、分类层级管理、商品分类的关联等功能。 (3&…...
fastjson漏洞--以运维角度进行修复
文章目录 前言一、漏洞详情二、修复过程1.通过脚本方式修复1.1.脚本修复原理1.2.脚本演示1.3.执行脚本 2. 手动升级包2.1.修复步骤2.2.遇到的问题 前言 该漏洞是三个月前由安全团队扫描出来的,主要影响是: FastJSON是阿里巴巴的开源JSON解析库,它可以解…...
82页精品PPT | 构建数字化工厂的智能制造-数字化智能制造
新模式、新技术 、新制造的挑战 中国制造业正处于转型升级的关键时期,面临着多方面的挑战。创新能力不足导致产品同质化严重,缺乏核心竞争力;质量管理水平参差不齐,影响着产品的可靠性和安全性;品牌价值不高ÿ…...
Claude Code 上下文管理机制深度拆解:超长 Agent 任务如何不崩盘
在一个真正复杂的企业级软件设计与编码任务里,Coding Agent 面对的从来不是一句简单的“帮我写个小游戏”。 它要理解用户的原始需求,要读取项目里的既有代码,要遵守架构约束、编码规范、接口协议,还要调用各种工具、加载不同的技能和规则,甚至记住用户十分钟前随口补充的…...
解放双手!用STAR-CCM+的3D-CAD模块快速清理与简化仿真几何(保姆级教程)
解放双手!用STAR-CCM的3D-CAD模块快速清理与简化仿真几何(保姆级教程) 在CAE仿真领域,几何模型的质量往往直接决定仿真效率与结果可靠性。许多工程师都有过这样的经历:从设计部门拿到一个细节完美的CAD模型,…...
告别PPT!用UE5.2+Lumen打造电商级产品交互展示(附MetaShoot插件实战)
用UE5.2与Lumen零代码打造电商级3D产品交互展示全指南 想象一下,当消费者在你的电商页面上不仅能360度旋转查看产品,还能像实体店一样拆解零件、切换材质,甚至模拟产品在真实环境中的使用效果——这种沉浸式体验能将转化率提升300%以上。传统…...
教育机构开设AI课程,如何用Taotoken为学生提供稳定实验环境
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 教育机构开设AI课程,如何用Taotoken为学生提供稳定实验环境 在高校或培训机构开设大模型应用相关课程时,一…...
告别卡顿!用ZLMRTCClient.js和Vue3打造超低延迟WebRTC监控播放器(附完整代码)
超低延迟WebRTC监控播放器:基于ZLMRTCClient.js与Vue3的工程实践 在安防监控、智慧园区等对实时性要求极高的场景中,传统流媒体方案如HLS或FLV往往面临3-5秒甚至更高的延迟。这种延迟在关键场景下可能导致严重后果——当监控画面显示"一切正常"…...
智能网页媒体嗅探:5分钟掌握开源浏览器扩展的完整资源管理方案
智能网页媒体嗅探:5分钟掌握开源浏览器扩展的完整资源管理方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾在浏览网页时&a…...
Bifrost:跨平台三星固件下载神器,解锁设备管理的全新境界
Bifrost:跨平台三星固件下载神器,解锁设备管理的全新境界 【免费下载链接】Bifrost Cross-platform tool for downloading Samsung mobile device firmware. 项目地址: https://gitcode.com/gh_mirrors/sa/Bifrost 你是否曾为寻找三星官方固件而烦…...
利用Taotoken多模型能力为AIGC应用动态选择最佳模型
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 利用Taotoken多模型能力为AIGC应用动态选择最佳模型 在构建内容生成类应用时,开发者常常面临一个核心挑战:…...
RISC-V PMP物理内存保护:硬件级隔离机制与嵌入式系统实战配置
1. 项目概述:为什么我们需要物理内存保护?在嵌入式系统、实时操作系统乃至一些对可靠性要求极高的服务器场景里,系统崩溃往往不是由复杂的逻辑错误直接导致的,而是源于一些看似“低级”的内存访问越界。想象一下,你正在…...
Flet按钮控件终极指南:从基础到高级的完整样式定制教程
Flet按钮控件终极指南:从基础到高级的完整样式定制教程 【免费下载链接】flet Build realtime web, mobile and desktop apps in Python only. No frontend experience required. 项目地址: https://gitcode.com/gh_mirrors/fl/flet Flet是一个革命性的Pytho…...
