<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[stone8761的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/stone8761</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; stone8761]]></copyright><item><title><![CDATA[NorFlash 知识点总结]]></title><link>https://blog.youkuaiyun.com/stone8761/article/details/134993278</link><guid>https://blog.youkuaiyun.com/stone8761/article/details/134993278</guid><author>stone8761</author><pubDate>Thu, 14 Dec 2023 13:41:09 +0800</pubDate><description><![CDATA[NorFlash（也称为 NOR 型闪存）是一种非易失性存储器，常用于嵌入式系统和存储设备中。NorFlash 是一种闪存类型，可以用于存储程序代码、固件、操作系统以及其他数据。与 NAND Flash 相比，NorFlash 具有较低的存储密度和较高的成本，但具有较快的读取速度、较低的读取延迟和较好的随机访问性能。这使得 NorFlash 适合用作执行代码和存储需要低延迟和高可靠性的关键数据的应用程序。它在嵌入式系统中被广泛应用于引导存储器和关键数据存储，为设备的启动和运行提供了可靠的解决方案。]]></description><category></category></item><item><title><![CDATA[SylixOS 自旋锁机制]]></title><link>https://blog.youkuaiyun.com/stone8761/article/details/129996248</link><guid>https://blog.youkuaiyun.com/stone8761/article/details/129996248</guid><author>stone8761</author><pubDate>Thu, 06 Apr 2023 18:37:19 +0800</pubDate><description><![CDATA[从上节可以看出不同的自旋锁接口底层都会执行 ARCH 层接口 archSpinLock()、archSpinUnlock()，因为这部分代码和具体的硬件架构有关。这是典型的 ticket spinlock，即引入了排队机制，以 FIFO 的顺序处理申请者。加锁过程主要是将 ticket 值加一，然后通过 now 和 ticket 的值判断当前是否排到自己，若没有排到则等待。5、不锁定中断, 同时允许加锁后调用可能产生阻塞的操作。2、忽略中断版本(必须在中断关闭的状态下被调用)6、自旋锁原始加锁操作。]]></description><category></category></item><item><title><![CDATA[基于 ACOEGC_T3(PF) 搭建 JLink 调试环境]]></title><link>https://blog.youkuaiyun.com/stone8761/article/details/126609917</link><guid>https://blog.youkuaiyun.com/stone8761/article/details/126609917</guid><author>stone8761</author><pubDate>Tue, 30 Aug 2022 18:25:16 +0800</pubDate><description><![CDATA[3、在 JLink 安装目录下创建目录：JLink_V645a\Devices\ALLWIN\T3，在目录中放入脚本文件 Core0.JLinkScript、Core1.JLinkScript、Core2.JLinkScript、Core3.JLinkScript（见附件）；5、使用同样的方式启动 core2 和 core3，4 个核都启动后可以通过 Debug 窗口切换调试对象，从而实现 4 核同时调试。1、这里仅介绍 4 核同时调试的情况，实际使用中可根据需要调试指定核即可；...]]></description><category></category></item><item><title><![CDATA[VMware 中搭建 SylixOS 环境]]></title><link>https://blog.youkuaiyun.com/stone8761/article/details/125927031</link><guid>https://blog.youkuaiyun.com/stone8761/article/details/125927031</guid><author>stone8761</author><pubDate>Fri, 22 Jul 2022 10:28:33 +0800</pubDate><description><![CDATA[重启即可，注意这里创建了两个虚拟硬盘，一个作为启动盘，一个作为文件系统盘。这样做是因为如果将一个虚拟硬盘分为两个区，则系统无法被正常引导，原因暂时还未知。插入U盘启动盘，点击“编辑虚拟机设置”，先改内存为1G。再次使用”打开电源时进入固件“的方式启动虚拟机，将100M分区作为第一启动项。制作成功后插入U盘。点击确定创建虚拟机，使用”打开电源时进入固件“的方式启动虚拟机。修改启动项到U盘启动，启动后进入U盘中的SylixOS。关闭虚拟机，删除虚拟机的U盘分区。...]]></description><category></category></item><item><title><![CDATA[SylixOS TCP 数据段发送流程简述]]></title><link>https://blog.youkuaiyun.com/stone8761/article/details/125855845</link><guid>https://blog.youkuaiyun.com/stone8761/article/details/125855845</guid><author>stone8761</author><pubDate>Mon, 18 Jul 2022 17:16:24 +0800</pubDate><description><![CDATA[tcp_output_segment()--->ip_output_if()--->ip4_output_if()--->ip4_output_if_opt_src()(大部分IP层协议内容在这里完成)--->ethernet_output()--->netdev_netif_linkoutput()--->NETDEV_TRANSMIT()3）调用tcp_output()用于发送TCP段。1）调用write发送TCP数据。...]]></description><category></category></item><item><title><![CDATA[SylixOS 进程资源回收机制]]></title><link>https://blog.youkuaiyun.com/stone8761/article/details/125767324</link><guid>https://blog.youkuaiyun.com/stone8761/article/details/125767324</guid><author>stone8761</author><pubDate>Wed, 13 Jul 2022 16:42:54 +0800</pubDate><description><![CDATA[SylixOS 中使用 t_reclaim 线程回收进程资源。t_reclaim 线程在系统启动时创建，优先级较低，为 253。线程执行流程非常简单，即接收消息队列值并执行 vprocReclaim() 进行回收，消息队列数据位待回收的线程控制块指针。如下图所示。        vprocReclaim() 执行流程如下：1）等待所有线程被彻底删除；2）回收线程全部资源（打开的文件、信号量、时间、定时器等）；3）释放模块资源；4）回收进程控制块资源        通过调用 __resReclaimReq()]]></description><category></category></item><item><title><![CDATA[基于 QEMUv8 搭建 OP-TEE 开发环境]]></title><link>https://blog.youkuaiyun.com/stone8761/article/details/125563745</link><guid>https://blog.youkuaiyun.com/stone8761/article/details/125563745</guid><author>stone8761</author><pubDate>Fri, 01 Jul 2022 18:13:47 +0800</pubDate><description><![CDATA[开发环境：Ubuntu 22.04 desktop 虚拟机1、环境需求$ sudo dpkg --add-architecture i386 $ sudo apt-get update$ sudo apt-get install android-tools-adb android-tools-fastboot autoconf automake bc bison build-essential ccache codespell cpio cscope curl device-tree-compiler ex]]></description><category></category></item><item><title><![CDATA[SylixOS TCP 数据段接收流程简述]]></title><link>https://blog.youkuaiyun.com/stone8761/article/details/125334151</link><guid>https://blog.youkuaiyun.com/stone8761/article/details/125334151</guid><author>stone8761</author><pubDate>Fri, 17 Jun 2022 15:19:38 +0800</pubDate><description><![CDATA[1、数据包最初由网卡驱动中断接收，通过调用 tcpip_input() 送入 LwIP 协议栈；2、在 tcpip_inpkt() 中将 ip_input() 通过 mbox (本质为消息队列) 投递至线程 “t_netproto”，并在线程中执行 ip_input()；3、在 ip_input() 中针对 IPv4 报文调用 ip4_input() 进行处理。针对 TCP 报文，tcp_input() 处理了基本的协议规则；4、针对有效数据包，通过调用 TCP_EVENT_RECV（即调用 tcp_rec]]></description><category></category></item><item><title><![CDATA[MS-RTOS 内核模块动态装载]]></title><link>https://blog.youkuaiyun.com/stone8761/article/details/125328902</link><guid>https://blog.youkuaiyun.com/stone8761/article/details/125328902</guid><author>stone8761</author><pubDate>Fri, 17 Jun 2022 10:33:04 +0800</pubDate><description><![CDATA[1、MS-RTOS 内核模块动态装载简介        MS-RTOS 支持内核模块动态装载功能。用户可以根据需要，在不需要对内核重新编译的情况下，使用 insmod、rmmod 等命令动态地将模块加入或移出内核。这样可以提高 MS-RTOS 的灵活性，当需要对模块进行修改时，不用对整个内核编译而只需要对模块进行编程即可。模块可以不依赖于某个固定的硬件平台，当模块被加载入内核后，就相当于静态链接到了内核中，内核和模块的地址空间可以相互访问。2、BSP 添加内核模块动态装载功能1）BASE 构建时需要添加 `]]></description><category></category></item><item><title><![CDATA[SylixOS ECS 启动过程]]></title><link>https://blog.youkuaiyun.com/stone8761/article/details/125080954</link><guid>https://blog.youkuaiyun.com/stone8761/article/details/125080954</guid><author>stone8761</author><pubDate>Wed, 01 Jun 2022 11:47:20 +0800</pubDate><description><![CDATA[在 SylixOS ECS 中可以通过 SHELL 命令 “ecs“ 和 ”srtp“ 创建一个新的容器环境，其中 ”ecs“ 命令本质就是使用 ”srtp"。1、新容器环境的创建是在 SHELL 命令背景线程中创建的，注册命令 "srtp" 时会加上创建新容器标志 LW_OPTION_KEYWORD_NEW_CONTAINER，如下图所示：2、SylixOS 处理 shell 命令的调用链：API_TShellExec() ---> __tshellExec() ---> __tshellBgCreate]]></description><category></category></item><item><title><![CDATA[bootloader 编译为 Debug 无法引导 MS-RTOS 问题]]></title><link>https://blog.youkuaiyun.com/stone8761/article/details/125053004</link><guid>https://blog.youkuaiyun.com/stone8761/article/details/125053004</guid><author>stone8761</author><pubDate>Mon, 30 May 2022 20:09:54 +0800</pubDate><description><![CDATA[一、问题描述

在智芯 SCM402F 芯片上，bootloader 如果按照 Debug 模式编译则无法成功引导 MS-RTOS，反之按照 Release 模式编译则可以正常引导。引导代码如下所示：


static void ms_boot_os(ms_addr_t *addr)
{
    ms_func_t func = (ms_func_t)addr[1U];

    ms_printk(MS_PK_NOTICE, "Start MS-RTOS...\n");
    
    ...]]></description><category></category></item><item><title><![CDATA[SylixOS 线程、进程退出流程]]></title><link>https://blog.youkuaiyun.com/stone8761/article/details/124636053</link><guid>https://blog.youkuaiyun.com/stone8761/article/details/124636053</guid><author>stone8761</author><pubDate>Sat, 07 May 2022 17:54:05 +0800</pubDate><description><![CDATA[SylixOS 中进程、线程可能由于 ”自然退出“、”接收 SIGKILL 信号（9 号）“、”接收 SIGCNCL 信号（16 号）“、”接收 SIGTERM 信号（15 号）“、“执行 exit()”、“执行 pthread_exit()” 等原因退出。下面以此简单描述一下各种情况下的退出流程：



1、自然退出

自然退出意思是指进程 main 函数执行到结束（或执行到 return）导致的进程退出。当进程 ”自然退出“，即在 API_ModuleRunEx() 中从...]]></description><category></category></item><item><title><![CDATA[SylixOS 信号发送、接收机制]]></title><link>https://blog.youkuaiyun.com/stone8761/article/details/124596337</link><guid>https://blog.youkuaiyun.com/stone8761/article/details/124596337</guid><author>stone8761</author><pubDate>Thu, 05 May 2022 20:04:04 +0800</pubDate><description><![CDATA[SylixOS 可以通过 kill() 或 sigqueue() 向线程发送信号（向进程发送信号相当于发送给进程的主线程）。kill() 与 sigqueue() 的区别主要在发送信号的类型不一样，kill() 发送非排队信号，sigqueue() 发送排队信号。

kill() 中首先会调用 _doKill() 接口，在 _doKill() 中构建信号信息结构 struct siginfo 和 LW_CLASS_SIGPEND 结构，这里主要是保存信号值、信号产生源、发送信...]]></description><category></category></item><item><title><![CDATA[Watchdog 芯片 ADM6316 介绍]]></title><link>https://blog.youkuaiyun.com/stone8761/article/details/124171315</link><guid>https://blog.youkuaiyun.com/stone8761/article/details/124171315</guid><author>stone8761</author><pubDate>Thu, 14 Apr 2022 14:34:59 +0800</pubDate><description><![CDATA[ADM6316 是一款硬件 Watchdog 芯片，同系列产品包括ADM6316、ADM6317、ADM6318、ADM6319、ADM6320、ADM6321、ADM6322。

芯片有 5 个引脚，如下图所示。



VCC ：VCC

GND ： GND

RESET ：输出复位信号复位控制器

MR：低电平为手动复位模式，1us 的低电平会强制芯片生成一个复位信号

WDI：如果 WDI 引脚保持低电平或者高电平一段时间，直到 Watchdog 定时器超时，则会导致芯...]]></description><category></category></item><item><title><![CDATA[Cortex M4 SysTick 详解]]></title><link>https://blog.youkuaiyun.com/stone8761/article/details/122949483</link><guid>https://blog.youkuaiyun.com/stone8761/article/details/122949483</guid><author>stone8761</author><pubDate>Tue, 15 Feb 2022 17:46:13 +0800</pubDate><description><![CDATA[Cortex M4 提供了 SysTick 功能，SysTick 是一个 24bits 定时器，可以通过简单的编程提供一个周期中断，常用于作为操作系统的”心跳“。



一、寄存器

1、STK_CTRL



2、STK_LOAD



3、STK_VAL



二、时钟源

SysTick 可选择两种时钟源，通过寄存器 STK_CTRL 的 CLKSOURCE 位来选择，‘0’ 表示时钟源为 AHB（HCLK）的 1/8，'1' 表示时钟源为 AHB（HCLK）。



三、重装载与中断

通过寄存器.]]></description><category></category></item><item><title><![CDATA[GIC 高优先级中断无法抢占低优先级中断问题分析要点]]></title><link>https://blog.youkuaiyun.com/stone8761/article/details/122868999</link><guid>https://blog.youkuaiyun.com/stone8761/article/details/122868999</guid><author>stone8761</author><pubDate>Thu, 10 Feb 2022 20:47:26 +0800</pubDate><description><![CDATA[SylixOS 支持中断抢占，但 BSP 中需要进行相应的配置，如果遇到高优先级中断无法抢占低优先级中断的情况基本可以按照以下几点进行分析：



以 T3 为例，中断控制器为 GIC 2.0：

1、高优先级中断的优先级需要高于 GICC_PMR 寄存器，这是每个 interface 的优先级阈值寄存器，优先级低于此值则此核无法接收到中断信号；



2、触发的中断的可抢占优先级（主优先级）需要高于正在执行的中断的可抢占优先级（主优先级）。GIC 控制器优先级是一个 8 位值，共有 255 个优先级，可.]]></description><category></category></item><item><title><![CDATA[GIC2.0 发送核间中断]]></title><link>https://blog.youkuaiyun.com/stone8761/article/details/122868826</link><guid>https://blog.youkuaiyun.com/stone8761/article/details/122868826</guid><author>stone8761</author><pubDate>Thu, 10 Feb 2022 20:44:43 +0800</pubDate><description><![CDATA[GIC2.0 通过操作 GICD_SGIR（0xf00）寄存器发送软中断





TargetListFilter 位设置 0 表示转发中断到 CPUTargetList 位所指定的核上：





SGIINTID 位设置需要发送的中断号 0-15。





因此发送软中断接口实现如下：


static VOID  armGicV1RaiseSoftIrq (UINT64  ullCpuId, ULONG  ulVector)
{
    ULONG   ulBase;
    UINT32 ...]]></description><category></category></item><item><title><![CDATA[STM32 调整重启电压阈值 BOR]]></title><link>https://blog.youkuaiyun.com/stone8761/article/details/122512956</link><guid>https://blog.youkuaiyun.com/stone8761/article/details/122512956</guid><author>stone8761</author><pubDate>Sat, 15 Jan 2022 17:16:50 +0800</pubDate><description><![CDATA[STM32 支持调整重启电压阈值，即 BOR。重启电压阈值指的是，如果电源电压低于此阈值，则 MCU 进入复位状态。有三个级别可以设置，level 1、level 2、level 3。以 STM32F412RE 为例，level 1 对应 2.13V、level 2 对应 2.44V、level 3 对应 2.75V。

此设置配置在 MCU 内部 FLASH 中的选项字中，地址为 0x1FFFC000：



 我们可以通过 FLASH 选项字控制寄存器 F...]]></description><category></category></item><item><title><![CDATA[C 语言静态库的一些特性总结]]></title><link>https://blog.youkuaiyun.com/stone8761/article/details/122501274</link><guid>https://blog.youkuaiyun.com/stone8761/article/details/122501274</guid><author>stone8761</author><pubDate>Fri, 14 Jan 2022 19:59:31 +0800</pubDate><description><![CDATA[一、静态库按 .o 为最小单位连接到程序，如果某个 .o 中的所有符号都没有被引入则这个 .o 不会被连接，反之 .o 中只要有一个符号被引入则链接整个 .o 。可以做一个例子来验证一下。

构建一个静态库，包含两个 .c 文件，libtest.c 和 libtest2.c。libtest.c 中包含三个函数：lib_func1()、lib_func2()、lib_func3()。


#include &lt;stdio.h&gt;

void lib_func1 (void)
{
   ...]]></description><category></category></item><item><title><![CDATA[SylixOS x86 HPET 定时器驱动]]></title><link>https://blog.youkuaiyun.com/stone8761/article/details/122499455</link><guid>https://blog.youkuaiyun.com/stone8761/article/details/122499455</guid><author>stone8761</author><pubDate>Fri, 14 Jan 2022 17:57:18 +0800</pubDate><description><![CDATA[HPET(High Precision Event Timer) 俗称高精度定时器，最低时钟频率为10MHZ，而且定义了比较严格的精确度（间隔 &gt;= 1 毫秒的允许 +-0.05% 的误差，间隔 &lt;=100 微妙的允许 +-0.2% 的误差）。x86 架构中一般支持 HPET 定时器。在 HPET 体系结构中规定 32 个定时器组成一个定时器块，最多可支持 8 个块，也就是 256 个定时器。实际设备中可使用的定时器数量可以从相关寄存器中查询。每个定时器均可以单独配置成一个中断。...]]></description><category></category></item></channel></rss>