RVOS的任务调度优化
12.系统优化–任务调度
12.1 改进任务管理功能
在原有基础上进⼀步改进任务管理功能。具体要求:改进 task_create()
,提供更多的参数,具体改进后的函数如下所⽰:
int task_create(void (*task)(void* param),void *param, uint8_t priority);- param 用于在创建任务执行函数时可带入参数,如果没有参数则传入 NULL。
- priority 用于指定任务的优先级,目前要求最多⽀持 256 级,0 最高,依次类推。
- timeslice:任务的时间片大小,单位是操作系统的时钟节拍(tick),此参数指定该任务一次调度可以运行的最大时间长度·和 priotity 相结合,调度器会首先根据 priority 选择优先级最高的任务运行,而 timeslice 则决定了当没有更高优先级的任务时,当前正在运行的任务可以运行的最大时间长度。
这里没啥好说的,难点就是c语言基本功,各种参数的传递要搞清楚,这里用的都是指针,我们存放的也都是地址,相互之间的参数传递也是使用32为地址来进行的。
(最开始还傻乎乎的以为,void *param,我们往里面传参的时候往往是把参数打包成一个struct传入,那么我用寄存咋能放得了,比如
tasks[_top].ctx.a0 = (reg_t) param;
,这里其实都是地址,所以是ok的。)
#define MAX_TASKS 10
#define MAX_PRIORITY 256struct task {struct context ctx; // 任务上下文uint8_t priority; // 任务优先级uint32_t timeslice; // 时间片大小uint32_t remaining_ticks; // 剩余时间片int active; // 是否活跃(1: 活跃, 0: 已退出)
};uint8_t __attribute__((aligned(16))) task_stack[MAX_TASKS][STACK_SIZE];
struct task tasks[MAX_TASKS];static int _top = 0;
static int _current = -1;void sched_init()
{w_mscratch(0);w_mie(r_mie() | MIE_MSIE);
}/** DESCRIPTION* Create a task.* - task: 任务入口函数* - param: 传递给任务的参数* - priority: 任务优先级* - timeslice: 时间片大小* RETURN VALUE* 0: success* -1: if error occurred*/
int task_create(void (*task)(void* param), void *param, uint8_t priority, uint32_t timeslice)
{if (_top < MAX_TASKS) {tasks[_top].ctx.sp = (reg_t) &task_stack[_top][STACK_SIZE];tasks[_top].ctx.pc = (reg_t) task;tasks[_top].ctx.a0 = (reg_t) param; // 将参数传递给任务tasks[_top].priority = priority;tasks[_top].timeslice = timeslice;tasks[_top].remaining_ticks = timeslice; // 初始化剩余时间片tasks[_top].active = 1; // 标记任务为活跃_top++;return 0;} else {return -1;}
}
12.2 优化任务调度算法
修改任务调度算法,在原先简单轮转的基础上⽀持按照优先级排序,优先选择优先级高的任务运行,同⼀级多个任务再轮转。
出现的问题:调度算法现在有明显问题,问题是高优先任务如果不结束,低优先级任务一直不会得到运行。
问题分析:
当前调度算法的问题是严格优先级调度,导致高优先级任务如果不主动退出或让出 CPU,低优先级任务永远无法运行。这种情况被称为优先级饥饿(Priority Starvation)。为了解决这个问题,可以引入时间片轮转调度和动态优先级调整的机制。
改进思路:
- 时间片轮转调度:
- 即使高优先级任务未结束,当其时间片用完后,也需要切换到其他任务(包括低优先级任务)。
- 通过时间片管理,确保所有任务都有机会运行。
- 动态优先级调整:
- 随着时间推移,未运行的低优先级任务可以逐渐提升优先级,避免长期被高优先级任务压制。
void schedule(void)
{if (_top <= 0) {panic("Num of task should be greater than zero!");return;}int highest_priority = MAX_PRIORITY;int next_task = -1;// 动态优先级调整:逐渐提升未运行任务的优先级for (int i = 0; i < _top; i++) {if (tasks[i].active && i != _current) {tasks[i].priority = (tasks[i].priority > 0) ? tasks[i].priority - 1 : 0;}}// 遍历任务列表,选择优先级最高的任务for (int i = 0; i < _top; i++) {if (tasks[i].active) {if (next_task == -1 || tasks[i].priority < highest_priority || (tasks[i].priority == highest_priority && i > _current)) {highest_priority = tasks[i].priority;next_task = i;}}}if (next_task == -1) {panic("No active tasks to schedule!");return;}// 时间片管理if (_current >= 0 && _current < _top) {tasks[_current].remaining_ticks--;if (tasks[_current].remaining_ticks == 0) {tasks[_current].remaining_ticks = tasks[_current].timeslice; // 重置时间片} else if (tasks[_current].priority <= tasks[next_task].priority) {// 当前任务时间片未用完,且优先级不低于下一个任务,继续运行return;}}// 切换到下一个任务_current = next_task;struct context *next = &(tasks[_current].ctx);switch_to(next);
}
12.3 增加任务退出接口
增加任务退出接口 task_exit()
,当前任务可以通过调用该接口退出执行,内核负责将该任务回收,并调度下⼀个可运行任务。建议的接⼝函数如下:
void task_exit(void);
实现思路:通过触发机器级软件中断来调用调度器,并标记当前任务为非活跃。(区分task_yield()是将任务剩余时间片清零)
/** DESCRIPTION* task_yield() causes the calling task to relinquish the CPU and a new * task gets to run.*/
void task_yield()
{if (_current >= 0 && _current < _top) {tasks[_current].remaining_ticks = 0; }/* trigger a machine-level software interrupt */int id = r_mhartid();*(uint32_t*)CLINT_MSIP(id) = 1;
}
出现的问题1:
task_exit
直接调用schedule()
出现Sync exceptions! Code = 1
问题分析:查阅RISCV体系架构的说明,该问题是指令异常。原因是直接调用 schedule()
函数时,当前任务的上下文没有正确保存,导致任务切换时访问了无效的指令地址或内存区域。
- 直接调用
schedule()
的问题:schedule()
函数会切换到下一个任务,但在切换之前,当前任务的上下文(如寄存器状态、程序计数器等)没有保存。- 当任务切换回来时,CPU 的状态可能已经被破坏,导致访问无效的指令地址或内存区域,从而触发
Instruction access fault
异常。
- 触发机器级软件中断的正确性:
- 使用
CLINT_MSIP
触发机器级软件中断时,RISC-V 的中断机制会自动保存当前任务的上下文(通过陷入中断处理程序)。 - 在中断处理程序中,调度器可以安全地切换任务,因为上下文已经被保存。
- 使用
解决方案
如果希望直接调用 schedule()
,需要确保在调用之前保存当前任务的上下文。以下是两种解决方案:
方案 1:使用中断触发调度(推荐)
保持现有的实现,通过触发机器级软件中断来调用调度器。这种方式利用了硬件中断机制,确保上下文正确保存。
void task_exit(void)
{if (_current >= 0 && _current < _top) {tasks[_current].active = 0; // 标记当前任务为非活跃int id = r_mhartid();*(uint32_t*)CLINT_MSIP(id) = 1; // 触发机器级软件中断}
}
方案 2:手动保存上下文后调用 schedule()
在直接调用 schedule()
之前,手动保存当前任务的上下文。
void task_exit(void)
{if (_current >= 0 && _current < _top) {tasks[_current].active = 0; // 标记当前任务为非活跃// 手动保存上下文struct context *current_ctx = &(tasks[_current].ctx);save_context(current_ctx); // 假设有一个保存上下文的函数// 调用调度器schedule();}
}
save_context()
函数需要实现保存当前任务的寄存器状态、程序计数器等上下文信息。
总结:
- 推荐使用中断触发调度:通过
CLINT_MSIP
触发机器级软件中断,确保上下文正确保存。- 避免直接调用
schedule()
:如果必须直接调用,需确保在调用之前手动保存上下文,但实现复杂且容易出错。
运行显示,任务可以正常退出,正常调度。
12.4 优化任务调度数据结构,提升调度效率
当前的调度器使用了简单的数组和 for
循环来遍历任务列表,导致在任务数量较多时效率低下。为了优化调度效率,可以引入更高效的数据结构和算法来管理任务队列和优先级。
这个其实应该在最开始优化的,数据结构出问题,感觉就是地基出问题,需要大改。
相关文章:
RVOS的任务调度优化
12.系统优化–任务调度 12.1 改进任务管理功能 在原有基础上进⼀步改进任务管理功能。具体要求:改进 task_create(),提供更多的参数,具体改进后的函数如下所⽰: int task_create(void (*task)(void* param),void *param, uint8…...
【论文阅读20】-CNN-Attention-BiGRU-滑坡预测(2025-03)
这篇论文主要探讨了基于深度学习的滑坡位移预测模型,结合了MT-InSAR(多时相合成孔径雷达干涉测量)观测数据,提出了一种具有可解释性的滑坡位移预测方法。 [1] Zhou C, Ye M, Xia Z, et al. An interpretable attention-based deep…...
图像预处理-图像噪点消除
一.基本介绍 噪声:指图像中的一些干扰因素,也可以理解为有那么一些点的像素值与周围的像素值格格不入。常见的噪声类型包括高斯噪声和椒盐噪声。 滤波器:也可以叫做卷积核 - 低通滤波器是模糊,高通滤波器是锐化 - 低通滤波器就…...
PP-OCR的安卓端部署
EMO了几天 我浪费了几天的生命,去研究PP-OCR的模型微调、从训练模型导出预测模型,结果一个坑接着一个坑,没有善终。 找了好多资料,得到一些负面信息,比如说飞浆的团队修复问题不及时啦,代码仓库有好多年不…...
2048小游戏C++板来啦!
个人主页:PingdiGuo_guo 收录专栏:C干货专栏 大家好呀,我是PingdiGuo_guo,今天我们来学习如何用C编写一个2048小游戏。 文章目录 1.2048的规则 2.步骤实现 2.1: 初始化游戏界面 2.1.1知识点 2.1.2: 创建游戏界面 2.2: 随机…...
研0大模型学习(第四、五天)
学习CSDN教程:VSCode Debug指南 但里面貌似主要是针对nodejs的,所以我在 CSDN教程:VSCode调试python程序 中学习,刚开始调试报错python版本太低,于是我安装了旧版本的pythondebugger,再把python解释器从原…...
编程规范之整数运算
在表达式中混用有符号数和无符号数时,可能会因隐式转换而导致非预期的结果。因此应尽量在表达式中使用相同符号类型的 变量。 对于无法使用相同符号类型的场景,应将不同类型的变量显式转换为相同类型,当表达式中的无符号数隐式转换为另一个有…...
【零基础】基于 MATLAB + Gurobi + YALMIP 的优化建模与求解全流程指南
MATLAB Gurobi YALMIP 综合优化教程(进阶) 本教程系统介绍如何在 MATLAB 环境中使用 YALMIP 建模,并通过 Gurobi 求解器高效求解线性、整数及非线性优化问题。适用于工程、运营研究、能源系统等领域的高级优化建模需求。 一、工具概览 1.…...
C++17 信号量模拟实现
C17 信号量模拟实现 一、实现原理 C17 标准库没有原生信号量(C20才有),但可以通过 std::mutex std::condition_variable 模拟实现。以下是核心逻辑: #include <mutex> #include <condition_variable>class CountingSemaphore { private:…...
LINUX学习——守护进程的含义及编程实现
实验目的 理解守护进程的含义。掌握编程实现守护进程的主要步骤。 实验步骤 守护进程的含义: 守护进程是运行在后台的一种特殊进程,独立于控制终端,周期性地执行任务或等待处理事件。守护进程通常以 d 结尾,如 httpd、sshd 等。…...
Json 在线格式化 - 加菲工具
Json 在线格式化 打开网站 加菲工具 选择“Json 在线格式化” 或者直接进入 https://www.orcc.top/tools/json 输入Json,点击左上角的“格式化”按钮 得到格式化后的结果...
final关键字带来的问题
定义了一个配置类: public class EsignConfig { public static final String EsignOrgId "*****"; // 应用ID public static final String EsignAppId "*****"; // 应用密钥 public static final String EsignAppSecret…...
Flash存储器(一):接口标准全解析
目录 一.接口类型与协议标准 二.应用场景 Flash存储器的接口设计直接影响其性能、应用场景及系统集成复杂度。以下从接口类型、协议标准及应用场景三个方面进行系统阐述。 一.接口类型与协议标准 Flash接口类型与协议标准 序号接口类型协议标准特点1并行接口…...
第18周:对于ResNeXt-50算法的思考
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 问题:在上一章代码中是ResNeXt-50的残差单元,问题:如果conv shortcutFalse那么在执行“xAdd0)…“语句时,通道数不一致的&…...
Django 结合 Vue 实现简单管理系统的详解
以下是一个 Django 结合 Vue 实现简单管理系统的详细步骤及示例代码: 项目整体架构思路 后端:使用 Django 搭建 RESTful API,负责数据的存储和处理。前端:使用 Vue 构建用户界面,通过调用后端 API 实现数据的展示、添加、修改和删除等操作。步骤 1:创建 Django 项目和应…...
ValueError: model.embed_tokens.weight doesn‘t have any device set
ValueError: model.embed_tokens.weight doesn’t have any device set model.embed_tokens.weight 通常在深度学习框架(如 PyTorch)中使用,一般是在处理自然语言处理(NLP)任务时,用于指代模型中词嵌入层(Embedding layer)的权重参数。下面详细解释: 词嵌入层的作用 …...
公务员行测之速算分数记忆检验-无答案版本
前言 这一篇是根据百分数,默写分数,我发现我看见百分数有点想不到分数 速算之百分数记忆检验 50 % \ 50\% 50% 33.3 % \ 33.3\% 33.3% 25 % \ 25\% 25% 20 % \ 20\% 20% 16.7 % \ 16.7\% 16.7% 14.3 % \ 14.3\% 14.3% 12.5 % \ 12.5\% 1…...
大模型面经 | DeepSpeed中ZeRO-1、ZeRO-2和ZeRO-3的区别是什么?
大家好,我是皮先生!! 今天给大家分享一些关于大模型面试常见的面试题,希望对大家的面试有所帮助。 往期回顾: 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题一) 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题二) 大模型面经 | 春招、秋招算法…...
【Java面试系列】Spring Boot微服务架构下的分布式事务设计与实现详解 - 3-5年Java开发必备知识
【Java面试系列】Spring Boot微服务架构下的分布式事务设计与实现详解 - 3-5年Java开发必备知识 引言 在微服务架构中,分布式事务是一个不可避免的话题。随着业务复杂度的提升,单体应用逐渐演变为多个微服务,如何保证跨服务的数据一致性成为…...
大语言模型减少幻觉的常见方案
什么是大语言模型的幻觉 大语言模型的幻觉(Hallucination)是指模型在生成文本时,输出与输入无关、不符合事实、逻辑错误或完全虚构的内容。这种现象主要源于模型基于概率生成文本的本质,其目标是生成语法合理、上下文连贯的文本&…...
方案解读:虚拟电厂标杆项目整体建设方案【附全文阅读】
在电力市场背景下,传统电力现货市场存在电能定价不合理、分布式电源并网困难等问题。本虚拟电厂标杆项目旨在研究全时间尺度虚拟电厂智能管控关键技术,通过研制虚拟电厂控制器样机、开发运行管理平台,实现对分布式能源的合理优化配置。项目内容涵盖虚拟调控、建设目标、建设…...
shiro使用
shiro是apache提供的一种安全框架。他可以将登录,权限这一方面简单化。 使用shiro需要引入 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.9.0</version></depend…...
Spring Boot日志系统详解:Logback与SLF4J的默认集成
大家好呀!👋 今天我们来聊聊Spring Boot中一个超级重要但又经常被忽视的功能——日志系统! 一、日志系统的重要性 首先,咱们得明白为什么日志这么重要?🤷♂️ 想象一下,你正在玩一个超级复…...
基于SpringBoot成绩管理系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
AI象棋 3.0 |AI自动下象棋工具,破译残局,自动帮助下棋,内置视频教程
Ai象棋是一款自动识别棋盘并分析下棋局势的工具,它能够自动化操作,帮助用户学习象棋知识。该软件无限制使用、界面无广告简洁,并提供永久授权。数据库中挑选1到2个即可完全满足使用需求,不必全部下载,解压mt管理器即可…...
刘鑫炜履新共工新闻社新媒体研究院院长,赋能媒体融合新征程
2025年4月18日,大湾区经济网战略媒体共工新闻社正式对外宣布一项重要人事任命:聘任蚂蚁全媒体总编刘鑫炜为新媒体研究院第一任院长。这一举措,无疑是对刘鑫炜在新媒体领域卓越专业能力与突出行业贡献的又一次高度认可,也预示着共工…...
学习型组织与系统思考
真正的学习型组织不是只关注个人的学习,而是关注整个系统的学习。—彼得圣吉 在这两年里,越来越多的企业开始询问是否可以将系统思考的内容内化给自己的内训师,进而在公司内部进行教学。我非常理解企业这样做的动机,毕竟内部讲师…...
mysql中优先使用datetime存储时间
基于大模型的问答进行了记录。 对为甚timestamp不如datetime好用做了深入了解,再此记录 范围广 ‘1000-01-01 00:00:00’ 到 ‘9999-12-31 23:59:59’ 而 timestamp 仅支持’1970-01-01 00:00:01’ 到 ‘2038-01-19 03:14:07’ UTC, 存在2038年问题, 不适合长期存…...
【Linux】深入理解Linux文件系统:从C接口到内核设计哲学
文章目录 前言一、C语言中的文件接口1. 文件指针(句柄)FILE*以写方式打开文件,若文件不存在会新建一个文件W写入方式,在打开文件之前都会将文件内容全部清空追加写方式,其用法与写方法一致,不同在于a方法可…...
前端零基础入门到上班:Day7——表单系统实战全解析
🧩前端零基础入门到上班:Day7——表单系统实战全解析 ✅ 目标:不仅掌握 HTML 表单标签,更深入理解其在实战中的作用、验证方式、美化技巧与 JS 联动,为后续接入 Vue、后端接口打下坚实基础。 🌟 一、HTML 表…...
阀门轴承电动车工件一键精修软件
若需定制开发“ComfyUI意见精修软件” 技术栈建议: 前端:React/Vue Figma插件API(直接读取设计稿)。 后端:Node.js/Python NLP库(spaCy/NLTK)。 数据库:MongoDB(存储…...
【疑难杂症】【VS Code】VS Code连接不上远程服务器
【疑难杂症】【VS Code】VS Code连接不上远程服务器 经过多轮资料查询和测试,这种时候有三种可能: 可能原因1:服务器磁盘空间不足,无法创建服务器连接。 解决方案:清理磁盘空间,尤其是/tmp文件所在的磁盘。…...
Word 中“母版页”的等效机制
Word 和 PowerPoint 不太一样——**Word 实际上没有像 PowerPoint 那样的“母版页(Master Page)”**功能。但它有1个和“母版页”功能类似的东西,可能造成你看到的“校徽自动出现在每一页”的现象: ✅ Word 中“母版页”的等效机制…...
大模型时代:AI应用的变革与挑战
最近研学过程中发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击链接跳转到网站人工智能及编程语言学习教程。读者们可以通过里面的文章详细了解一下人工智能及其编程等教程和学习方法。下面开始对正文内容的…...
C++ (菱形继承,通用接口 ,多态介绍)
菱形继承 class A{public :int a;};class B:public A{};class C:public A{};class D:public B,public C{public:void function(){a200;} };int main(){D object;// object.a100; 如果如此使用会产生报错 会导致一个成员在类D中出现两次,产生歧义,浪…...
vue3+vite 实现.env全局配置
首先创建.env文件 VUE_APP_BASE_APIhttp://127.0.0.1/dev-api 然后引入依赖: pnpm install dotenv --save-dev 引入完成后,在vite.config.js配置文件内加入以下内容: const env dotenv.config({ path: ./.env }).parsed define: { // 将…...
4.18日学习--引用
引用是变量的别名,它为已存在的变量提供了一个新的名称,对引用的操作实际上就是对其所引用变量的操作。引用在定义时必须初始化,且一旦初始化后就不能再引用其他变量。 #include <iostream> using namespace std;//引用做函数的返回值…...
poj1067 取石子游戏 威佐夫博弈
题目 有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法, 一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者…...
文件二进制读写和文本读写以及编码解码
假如是utf8编码,windows系统 写:往键盘中写的字符会被utf8编码成字节写入文件。假如是文本写,\n会被替换为\r\n写入,结尾会加文件结束符EOF。假如是二进制写,\n就是\n,文件结尾也不会加什么EOF 读ÿ…...
Java学习手册:常见并发问题及解决方案
在Java并发编程中,开发者常常会遇到各种并发问题,这些问题可能导致程序行为不可预测、性能下降甚至程序崩溃。以下是一些常见的并发问题及其解决方案: 1.竞态条件(Race Condition) 竞态条件是指多个线程同时访问共享…...
幽灵依赖与常见依赖管理
文章目录 前言1. 演示:检测和修复幽灵依赖步骤1:安装 depcheck步骤2:在项目根目录运行 depcheck可能的输出步骤3:修复幽灵依赖 2. 依赖管理的好习惯 1. 场景设定现在有如下依赖需求: 2. 依赖冲突的表现3. 解决依赖冲突…...
第T7周:咖啡豆识别
🍨 本文为🔗365天深度学习训练营中的学习记录博客 🍖 原作者:K同学啊 VGG 网络优缺点分析: ● 优点: 结构简洁统一:整张网络结构统一,只使用 33 的小卷积核和 22 的最大池化&…...
【MySQL数据库入门到精通】
文章目录 一、SQL分类二、DDL-数据库操作1.查询2.创建数据库3.删除数据库4.使用数据库 三、DDL-表操作1.查询 一、SQL分类 根据功能主要分为DDL DML DQL DCL DDL:Date Definition Language数据定义语言:定义数据库,表和字段 DML:Date Manipulatin Lan…...
C++智能指针的知识!
个人主页:PingdiGuo_guo 收录专栏:C干货专栏 大家好呀,我是PingdiGuo_guo,今天我们来学习一下智能指针。 文章目录 1.智能指针的概念 2.智能指针的思想 3.智能指针的作用 3.1 自动内存管理 3.2 共享所有权 3.3 避免悬挂指针…...
4.6 实现重定向
本实战通过ServletDemo09类演示了Servlet中的重定向功能。该Servlet通过HttpServletResponse的sendRedirect方法实现页面跳转。在doPost方法中,根据请求参数username和password判断用户身份。若用户名为admin且密码为123456,则调用sendRedirect方法将页面…...
Linux中的管道
管道的概念 管道是一种进程间通信的方式。 管道是一种半双工通信机制,数据只能读或写,如果要读写同时进行就要创建两个管道 管道的类型 1、匿名管道PIPE:通常在亲缘进程中使用(兄弟、父子) 函数参考:匿名管…...
深入简出:KL散度、交叉熵、熵、信息量简介、交叉熵损失
学习这些的最终目的 1、量化两个概率分布的差异 2、推导交叉熵损失 一、KL散度 KL散度就是用来量化两个概论分布的差异,如何量化? 计算真实概论分布P信息量 和 估计概论分布为Q,但实际概率分布为P时信息量的差值 那么设,概率分…...
`peft`(Parameter-Efficient Fine-Tuning:高效微调)是什么
peft(Parameter-Efficient Fine-Tuning:高效微调)是什么 peft库是Hugging Face推出的用于高效参数微调的库,它能在不调整模型全部参数的情况下,以较少的可训练参数对预训练模型进行微调,从而显著降低计算资源需求和微调成本。以下从核心功能、优势、常见微调方法、使用场…...
Windows 图形显示驱动开发-WDDM 1.2功能—Windows 8 中的 DirectX 功能改进(五)
一、每个阶段的 UAV—架构革新与限制突破 在 Microsoft Direct3D 11 中,计算着色器 (UAV) 的无序访问视图数限制为 8 个, (像素着色器) RTV) UAV (8 个组合 (呈现目标视图。 在 DirectX 11.1 中,可绑定的数量已增加。 对于 DirectCompute&a…...
机械臂速成小指南(二十五):机械臂与人工智能的有机结合
👨🏫🥰🥳需要机械臂相关资源的同学可以在我的主页中寻找哦🤖😽🦄 指南目录📖: 🎉🎉机械臂速成小指南(零点五)&…...