- 博客(111)
- 收藏
- 关注
原创 Freertos的故障诊断
本章重点介绍FreeRTOS新手用户遇到的最常见问题。首先,它侧重于三个问题,这些问题已被证明是多年来最常见的支持请求来源;中断优先级分配不正确、堆栈溢出和printf()使用不当。然后,它以常见问题解答的风格简要介绍了其他常见错误、可能的原因及其解决方案。使用configASSERT()可以立即捕获和识别许多最常见的错误源,从而提高生产率。强烈建议在开发或调试FreeRTOS应用程序时定义configASSERT()。
2024-10-30 14:51:52
1424
原创 freertos的开发支持
当应用程序在调试器的控制下执行时,清单164中所示的configASSERT()的定义很有用。它将停止对任何断言失败的行的执行,因此断言失败的行将是调试会话暂停时调试器显示的行。configASSERT() 的定义当一个应用在调试器的控制下没有被执行,清单165中所示的configASSERT()的定义很有用。它打印输出或以其他方式记录断言失败的源代码行。使用标准C __FILE__宏来获取源码名字,在源码中使用标准CLINE宏来获取行数。
2024-10-28 16:55:02
894
原创 FreeRTOS的事件组
实时嵌入式系统必须对事件做出响应。FreeRTOS允许将事件传递给任务。此类功能的示例包括信号量和队列,两者都具有以下属性:它们允许任务在“阻塞”状态下等待单个事件发生。 当事件发生时,它们会取消阻塞单个任务——取消阻塞的任务是等待事件的最高优先级任务。事件组是FreeRTOS的另一个功能,允许将事件传递给任务。与队列和信号量不同:事件组允许任务在“阻塞”状态下等待一个或多个事件的组合发生。事件组在事件发生时取消阻塞正在等待同一事件或事件组合的所有任务。
2024-10-24 15:31:43
1098
原创 FreeRTOS的中断管理
如果调用 xSemaphoreGiveFromISR()会使任务离开阻塞状态,并且未阻塞的任务的优先级高于当前正在执行的任务(被中断的任务),然后,在内部,xSemaphoneGiveFromISR()会将*pxHigherPriorityTaskWoken设置为pdTRUE。通常需要使用中断服务例程(ISR)中的FreeRTOS API函数提供的功能,但许多FreeRTOS API函数执行的操作在ISR内部无效,其中最值得注意的是将调用API函数的任务置于阻塞状态;中断服务例程的实现如下所示。
2024-10-22 09:21:00
1775
原创 FreeRTOS的堆内存管理
FreeRTOS是作为一组C源文件提供的,因此成为一名合格的C程序员是使用FreeRTOS的先决条件,因此本章假设读者熟悉以下概念: 如何构建C项目,包括不同的编译和链接阶段。 堆栈和堆是什么。 标准的C库malloc()和free()函数。动态内存分配及其与FreeRTOS的相关性后续章节将介绍内核对象,如任务、队列、信号量和事件组。为了使FreeRTOS尽可能易于使用,这些内核对象不是在编译时静态分配的,而是在运行时动态分配的;
2024-10-19 16:13:14
1235
原创 FreeRTOS的资源管理
在多任务系统中,如果一个任务开始访问资源,但在从运行状态转换出来之前没有完成访问,则可能会出现错误。如果任务使资源处于不一致的状态,那么任何其他任务或中断对同一资源的访问都可能导致数据损坏或其他类似问题。以下是一些示例:1.访问外围设备考虑以下场景,其中两个任务试图写入液晶显示器(LCD)。1.任务A执行并开始将字符串“Hello world”写入LCD。2.任务A在只输出字符串的开头“Hello w”后被任务B抢先执行。3.任务B在进入阻止状态之前向LCD写入“中止、重试、失败?
2024-10-16 08:54:51
923
原创 freertos的软件定时器管理
软件定时器用于在未来的设定时间或以固定频率定期执行功能。由软件定时器执行的函数称为软件定时器的回调函数。软件定时器由FreeRTOS内核实现,并受其控制。它们不需要硬件支持,也与硬件定时器或硬件计数器无关。注意,根据FreeRTOS使用创新设计确保最高效率的理念,除非软件定时器回调函数实际正在执行,否则软件定时器不会使用任何处理时间。软件定时器功能是可选的。要包括软件定时器功能:1.作为项目的一部分,构建FreeRTOS源文件FreeRTOS/source/tiimes.c。
2024-10-15 13:36:29
1120
原创 freertos的任务管理
vTaskDelayUntil()是API函数,当需要固定的执行周期(您希望任务以固定的频率定期执行)时,应该使用该函数,因为调用任务被取消阻止的时间是绝对的,而不是相对于函数被调用的时间(如vTaskDelay())。任务1是一个高优先级的事件驱动任务,它的大部分时间都处于阻塞状态,等待其感兴趣的事件。示例4中创建的两个任务是周期性任务,但使用vTaskDelay()并不能保证它们运行的频率是固定的,因为任务离开Blocked状态的时间与它们调用vTaskDelay()的时间有关。
2024-10-14 09:37:41
1479
原创 simulink之信号组
例如,如果您选择的信号数量与要替换的信号生成器组中的信号数量不同,则“Confirm Selection”将保持灰色。您可以按照选择信号的顺序将信号附加到连续信号组的末尾。此语句意味着您选择的信号数量与信号组的数量相同,并将每个信号顺序附加到不同的组中。如果不指定信号名称,信号生成器块将使用Imported_signal#格式指定一个默认名称,其中#随着每个额外的未命名信号而递增。如果附加的信号组的信号名称与信号生成器块中存在的信号名称不同,软件会将现有信号的名称更改为与附加的信号相同。
2024-09-03 11:54:34
3043
原创 simulink之显示信号属性
模型中的信号线具有数据类型、维度和数值复杂性等属性。当你在方框图上显示这些属性时,你可以:使模型更易于他人理解。确定信号最终用于模拟的属性值(例如,当信号使用继承的数据类型时)。规划你的策略,沿着数据路径(一系列连接的块)控制这些属性。此外,要在可搜索、可排序的表中检查和指定这些属性,可以使用模型数据编辑器。
2024-09-01 16:27:25
2635
原创 监控状态流图中的测试点
此示例展示了如何将数据或状态指定为测试点,你可以在仿真过程中使用浮动范围绘制这些测试点或将其记录到MATLAB基本工作区。关于状态流图中的测试点Stateflow测试点是您可以在模拟过程中观察到的信号,例如,通过使用浮动范围块。您可以使用这些属性指定状态或本地数据作为测试点:Size -标量、一维或二维Type -除ml之外的任何数据类型Location -状态流程图的子状态。
2024-08-21 15:24:03
364
原创 SIL 和 PIL模拟
使用Embedded Coder,您可以运行模型的软件在环(SIL)和处理器在环(PIL)仿真。这些模拟为顶部模型或模型的一部分生成源代码。SIL模拟在您的开发计算机上编译并运行生成的代码。PIL模拟在您的开发计算机上交叉编译源代码,然后在目标处理器或等效的指令集模拟器上下载并运行目标代码。通过SIL和PIL模拟,你可以:测试你的模型和生成的代码在数值上是否相等。注意代码覆盖率。执行代码执行分析。
2024-08-19 10:35:56
970
原创 什么是硬件在环仿真?
硬件在环Hardware-in-the-loop(HIL)仿真是一种实时仿真。您可以使用HIL模拟来测试您的控制器设计。HIL模拟显示了控制器如何实时响应逼真的虚拟刺激。您还可以使用HIL来确定您的物理系统(设备)模型是否有效。在HIL模拟中,您使用实时计算机作为设备模型的虚拟表示和控制器的真实版本。该图显示了典型的HIL模拟设置。台式计算机(开发硬件)包含控制器和设备的实时模型。开发硬件还包含一个接口,用于控制设备的虚拟输入。控制器硬件包含根据控制器模型生成的控制器软件。
2024-08-19 09:00:36
869
原创 使用连接结点表示多条路径
冲突转换是模拟过程中状态流图中来自同一源的两条同样有效的路径。在发生冲突的情况下,Stateflow软件会根据图表中的排序模式(显式或隐式)评估同样有效的转换。对于显式排序(默认模式),冲突转换的评估将根据您为每个转换指定的顺序进行。对于C图表中的隐式排序,冲突转换的评估是基于隐式排序中描述的内部规则进行的。
2024-08-15 15:21:11
1096
原创 Moore图的设计考虑
你无法在Moore图表中定义数据存储内存(DSM),因为图表外部的对象会修改DSM对象。状态流程图使用数据存储内存与Simulink®模型共享数据。数据存储内存充当全局数据。包含图表的Simulink层次结构中的其他块和模型可以修改DSM。Moore图不得访问可能发生不可预测变化的数据。
2024-08-14 14:02:16
662
原创 Mealy图的设计考虑
您无法在Mealy图表中定义数据存储内存(DSM),因为DSM对象可以被图表外部的对象修改。状态流程图使用数据存储内存与Simulink模型共享数据。数据存储内存充当全局数据,可以由包含图表的Simulink层次结构中的其他块和模型修改。Mealy图表不应访问可能发生不可预测变化的数据。
2024-08-14 09:01:18
641
原创 Mealy和Moore状态机概述
Mealy和Moore状态机的语义学Mealy和Moore通常被认为是建模有限状态机的基本行业标准范式。通常在状态机模型中,下一个状态是当前状态及其输入的函数,如下所示:状态是本地数据和图表活动的组合。因此,计算状态意味着更新本地数据并从当前活动状态转换到新状态。状态从一个阶段延续到另一个阶段。在这种情况下,Mealy和Moore状态机都有明确的语义。
2024-08-13 16:34:03
740
原创 使用默认转换执行控制图
历史节点记录了状态B4是超级状态B的先前活动子状态的情况。当状态A最初处于活动状态时,此序列完成了与事件E_one关联的Stateflow®图表的执行。6 状态B检测到向状态B.B1的有效默认转换。此示例显示了从OR状态到具有异或分解的超状态的转换,其中定义了到子状态的默认转换。从状态A到超状态B存在有效的转换。当状态A最初处于活动状态时,此序列完成了与事件E_one关联的此状态流程图的执行。从状态A到超状态B有一个有效的转换。历史节点表明子状态B.B4是最后一个活动子状态,它将成为转换的目的地。
2024-08-12 15:47:56
799
原创 Simulink函数如何绑定到状态
当状态A1在t=5时变为非活动状态时,Simulink函数保持计数器值。当A1在t=7时再次激活时,计数器的值与t=5时的值相同。当状态A1在t=5时变为非活动状态时,Simulink函数不保存计数器值。如果Simulink函数绑定到状态,则可以将子系统变量保持在上次执行时的值,也可以将变量重置为初始值。当Simulink函数位于某个状态内时,该函数会绑定到该状态。例如,以下Stateflow图表显示了绑定到状态的Simulink函数。此示例显示了Simulink函数在绑定到状态时的行为。
2024-08-09 14:25:04
549
原创 真值表编程
打开真值表进行编辑在图表中创建并标记真值表后,您可以指定其逻辑行为。要打开真值表,请双击真值表函数。默认情况下,真值表包含一个条件表和一个动作表,每个表都有一行。条件表包含一个决策列D1和一个动作行。
2024-08-08 16:42:14
1721
原创 通过定义真值表函数重用组合逻辑
1、在对象选项板中,单击真值表函数图标。将指针移动到图表中新真值表函数的位置。2 输入函数的签名标签,如声明函数参数和返回值中所述。3 对真值表函数进行编程。4 在模型资源管理器中,展开图表对象并选择真值表函数。函数签名的参数和返回值显示为属于函数的数据项。参数的作用域为Input。返回值的作用域为Output。5 在每个参数和返回值的“data properties”对话框中,指定数据属性。6 创建你的函数所需的任何其他数据项。你的函数可以访问自己的数据或属于父状态或图表的数据。
2024-08-07 17:01:34
906
原创 并行状态的广播事件
平行状态的广播事件此示例显示了并行状态下事件广播操作的行为。最初,图表处于休眠状态。并行子状态A.A1.A1a和A.A2.A2a处于活动状态。事件E_one发生并唤醒图表,图表从根向下通过层次结构处理事件:1 图表根会检查根级别是否存在E_one导致的有效转换。不存在有效的转换。2 状态A during actions (durA()) 执行并完成。3 状态A的子状态是平行(AND)状态。因为隐式排序适用,所以状态是从左到右、从上到下进行评估和执行的。首先评估状态A.A1。
2024-08-04 17:21:25
650
原创 事件如何驱动图表运行
由于图表在单个线程上运行,因此基于事件发生的操作对该事件是原子性的。图表中由事件引起的所有活动都在执行返回到接收事件之前发生的活动之前完成。事件的父级通常决定谁可以触发该事件(具有接收权限)。注意:Simulink模型中的输出边缘触发事件执行相当于在1和0之间切换输出数据值的值。1 如果事件的接收器处于活动状态,则执行。(事件接收器是事件的父级, 除非使用send()函数进行定向事件广播。您可以使用事件通过广播事件来控制图表的处理。3 在广播事件后,广播者根据导致事件的动作语句类型执行早返回逻辑。
2024-07-29 17:30:51
334
原创 事件广播的早返回逻辑
C状态现在是其图表中唯一活跃的子状态。状态流程图无法返回到从状态A到状态B的转换,并在广播事件F的条件操作后继续(步骤3)。其次,如果图表允许转换,状态B将成为图表的第二个活动子状态。因此,该图表使用早期返回逻辑并停止从状态A到状态B的转换。可以看到untitled_c3_untitled函数中使用了递归,但是在递归中有switch判断,函数直接会跳到untitled_event_F这个条件中,从而执行untitled_IN_C图表中的内容,完成后break跳出函数,从而不会陷入无限的函数递归中。
2024-07-29 15:47:28
747
原创 使用绑定操作控制 Function-Call 子系统
你Bind 状态中的操作将指定的数据和事件绑定到该状态。绑定到一个状态的事件只能通过该状态或其子状态的行为进行广播。你还可以将函数调用事件绑定到状态,以启用或禁用事件触发的函数调用子系统。函数调用子系统在进入具有绑定事件的状态时启用,在退出该状态时禁用。函数调用子系统的执行完全绑定到调用它的状态的活动。
2024-07-26 17:12:34
736
原创 通过 Function-Call Input Events启用图表中的控制状态
如果图表的父级是Model Root,则将“States When Enabling”设置为“Inherit ”相当于将属性设置为“Held”。当函数调用输入事件重新启用图表时,图表会保留其状态的最新值。在模拟过程中,当函数调用输入事件在t=20和t=40时重新启用图表时,输出y保持其最新值。在由function-call input event启用的图表中,可以通过设置启用图表时的状态属性来控制状态的行为。根据此属性的值,当输入事件重新启用图表时,状态要么保持其最新值,要么恢复为初始值。
2024-07-26 15:11:36
439
原创 通过发送input event激活状态流图
input event 发生在Stateflow®图表之外,但仅在该图表中可见。这种类型的事件使其他Simulink®块(包括其他状态流程图)能够通知其外部发生的特定事件图表。要定义输入事件:将事件添加到状态流程图中。将事件的Scope属性设置为Input from Simulink。在Simulink模型中,Stateflow块的顶部出现一个触发端口。输入事件可以通过控制信号(边缘触发器)的变化或Simulink块的函数调用来激活状态流程图。
2024-07-26 14:17:23
988
原创 同步状态的广播事件
定向活动广播你可以直接将事件从一个状态广播到另一个状态,以同步同一图表中的并行(AND)状态。以下规则适用:在事件广播期间,接收状态必须处于活动状态。一个图表中的操作无法将事件广播到另一个图表的状态。与无定向广播相比,使用定向本地事件广播有以下好处:防止模拟过程中出现不必要的递归。提高生成代码的效率。
2024-07-24 18:22:44
358
原创 使用Bus Editor创建总线对象
要以交互方式创建总线对象及其元素,请使用Simulink®总线编辑器。使用总线编辑器创建的总线对象存储在MATLAB®基本工作区中。要模拟使用总线对象的块,总线对象必须位于基本工作区或数据字典中。要保存与模型关联的总线对象定义,请将总线对象从基本工作空间导出到MATLAB代码文件或MAT文件中。可以在定义总线对象之前或之后将总线对象指定为块的数据类型。但是,在模拟模型之前,总线对象和相应的总线信号必须具有相同数量、相同顺序的总线元素。此外,总线对象和模型中相应信号中的每个总线元素必须具有相同的属性。
2024-07-24 10:44:23
1604
原创 在状态流图中重用自定义C代码
要输入定义两个常量的自定义代码:打开“Model Configuration Parameters”对话框。选择“Simulation Target”窗格。在“Header file”子面板中,输入#define和#include语句。例如,在这个例子中,您使用以下代码定义全局常量:#定义TRUE 1然后搭建以下模型,编译一下,编译通过。此示例显示了如何使用自定义C代码定义适用于模式中所有图表的常量、变量和函数。该图表访问名为myglobal的自定义变量,并调用名为fun的自定义函数。
2024-07-19 11:34:40
699
1
原创 Stateflow中的状态转换表
Stateflow软件会根据您创建的状态转换表自动生成只读状态转换图。当您向状态转换表输入更改时,Stateflow也会增量更新图表。不要在Stateflow®图表中以图形方式绘制状态和转换,而是使用状态转换表以表格格式表示模态逻辑。状态转换表支持使用MATLAB®和C作为动作语言。在图表中添加或删除状态时,必须重新排列状态、转换和连接。在状态转换表中添加或删除状态时,不必重新排列任何图形对象。状态转换表支持状态流程图中最常用元素的子集。状态转换表必须至少有一个状态行和一个转换列。
2024-07-18 15:59:26
829
原创 状态流在编辑时检测的建模规则
Stateflow®编辑器通过以红色或橙色突出显示对象来显示潜在的错误和警告。为了显示语法错误,Stateflow用红色波浪线突出显示错误。通过在设计图表时修复这些问题,可以避免潜在的编译或运行时警告和错误。要查看详细信息和可能的修复,请将光标放在对象上并单击徽章。要关闭编辑时间检查和语法错误突出显示,请清除Display > Error & Warnings。更改相应配置参数的诊断级别时,编辑时诊断级别也会更改。
2024-07-17 16:34:33
1519
原创 从图表访问Data Store Memory
Simulink®模型将全局变量实现为数据存储,可以是数据存储内存块,也可以是Simulink.Signal的实例。您可以使用数据存储在多个Simulink块之间共享数据,而无需显式的输入或输出连接来将数据从一个块传递到另一个块。Stateflow®图表通过符号化地读取和写入数据存储内存,与Simulink模型共享全局数据。要从图表中访问全局数据,请将Stateflow数据对象绑定到Simulink数据存储。创建绑定后,Stateflow数据对象将成为Simulink数据存储内存的符号表示。
2024-07-17 14:32:17
801
原创 带有数据存储内存块的数据存储
然后,如果数据表中显示的数据存储读取或数据存储写入块引用由信号对象定义的数据存储,则该表包括与该对象对应的行。您可以在数据存储读取和数据存储写入块中使用此名称,就像它是数据存储内存块的数据存储名称一样。对于本地数据存储,对于下面列出的每个参数,您可以显式设置值,也可以让数据存储从数据存储写入和数据存储读取块继承值。数据存储名称属性指定数据存储写入和数据存储读取阻止访问的数据存储的名称。要定义仅在特定子系统及其包含的子系统中可见,但在模型块中不可见的数据存储,请将数据存储内存块拖动到子系统中。
2024-07-16 15:07:23
1207
原创 通过定义图形函数重用逻辑模式
Inline ——如果你不将函数导出到其他图表,并且它不是递归的一部分,则内联你的函数。调用图形函数的语法与函数签名相同,实际参数会替换签名中指定的形式参数。函数的位置决定了它的作用域,即可以调用函数的状态和转换集。如果要从模型中的任何图表调用函数,请将图形函数放在图表级别,并启用图表级别图形函数的导出。函数签名标签指定了函数的名称及其参数和返回值的正式名称。要将整个图表窗口专门用于函数编程,请双击函数框,访问子章节图形函数中的流程图。如果你想在图表中的任何地方调用该函数,请将你的图形函数放在图表级别。
2024-07-15 14:10:20
480
原创 编程建模文件
你可以在MATLAB®命令提示符下以编程方式执行大多数Simulink®建模基础。与基本建模操作(如创建模型、向模型添加块和设置参数)相对应的命令列在“模型编辑基础知识”的“功能”部分中。这些示例显示了其中一些命令以及如何使用它们。
2024-07-04 15:38:33
340
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人