当前位置: 首页 > article >正文

013.定时器之系统Tick实现|千篇笔记实现嵌入式全栈/裸机篇

⚠️裸机仓库https://gitee.com/simonchina_carel_li/mini2440-bare-metal.git⚠️Tag:13-sys-tick1. 为什么要系统Tick在前面的SDRAM测试程序中我们有这样的部分// -- TODO: 如果你有定时器驱动在这里记录 start_time -- // uint32_t start_time timer_get_ticks(); for (i 0; i words_1MB; i) { pDst[i] pSrc[i]; } // -- TODO: 在这里记录 end_time计算 MB/s -- // uint32_t end_time timer_get_ticks(); // printf( - 耗时: %d ticks\r\n, end_time - start_time);我们需要有一个后台运行的准确的系统石基定时器然后通过获取每个时刻的Tick值做类似间隔判断的操作后面随便程序越来越复杂这种需求越发迫切因此我们先实现这个系统Tick的框架功能2. 方案分析先看下框图定时器是先通过预分频器然后通过分频器进行了两次分频而且Timer4是个纯内部定时器没有外部IO因此我们选择Timer4作为系统Tick定时器查阅数据手册整理具体方案项项怎么做定时器输入时钟定时器输入时钟频率 P C L K / 预分频值 1 / 分频值 定时器输入时钟频率 PCLK / {预分频值1} / {分频值}定时器输入时钟频率PCLK/预分频值1/分频值我们不进行预分频然后再继续8分频好了那么定时器输入时钟频率 50.625 M H z / 1 / 8 6.328125 M H z 定时器输入时钟频率 50.625MHz / 1 / 8 6.328125MHz定时器输入时钟频率50.625MHz/1/86.328125MHz预分频值 0分频值 8Tick的粒度设计为10ms那么每次定时器装填值在6.328125MHz的输入时钟基础上6.328125 M H z / 1000 ∗ 10 − 1 63280.25 63280 6.328125MHz / 1000 * 10 - 1 63280.25 632806.328125MHz/1000∗10−163280.2563280这个值没有溢出uint16~要实现自动装载查阅手册得知要实现自动装载必须先手动装载一次将初始值扔进去就是要手动装载一次 切换到自动装载实现Tick自增利用中断框架实现irq_int_timer4_handler然后在此函数中做Tick递增即可然后实现一个Tick的获取接口供应用层使用3. 代码实现3.1 Tick代码创建common/timer.c,查阅手册具体寄存器配置见注释#include s3c2440a.h #include stdbool.h static volatile unsigned long sys_tick_count_10ms 0; /// brief 定时器初始化 /// PCLK 50.625MHz void timer_init() { // 目标: 定时器输入时钟频率 50.625MHz / 1 / 8 6.328125MHz // 定时器输入时钟频率 PCLK / {预分频值1} / {分频值} // 预分频全部是0 TCFG0 (0 8) | (0 0); // 分频值是8 TCFG1 (0b0010 16); // 每个tick 10ms // 设置装填值 // 6.328125MHz / 1000 * 10 63281.25 TCNTB4 63281; // 先要手动装填一次 // [22]自动重载0, [21]手动更新1, [20]启动0 // 此时缓冲寄存器的值被装载到了内部倒数器中 TCON (1 21); // 启动定时器并开启自动重载 // [22]自动重载1, [21]手动更新0, [20]启动1 // 注意手动更新位必须清零 TCON (1 22) | (1 20); // 开启Timer4中断 irq_src_enable(IRQ_INT_TIMER4, true); } void irq_int_timer4_handler(void) { sys_tick_count_10ms; } unsigned long sys_tick_get_ms() { return sys_tick_count_10ms * 10; }将初始化函数放到hal_init()中调用调整Makefile等3.2 测试程序创建Tick测试程序tick/main.c#include s3c2440a.h int main() { unsigned long cnt_bef 0; while (1) { easy_delay_ms(100); unsigned long cnt sys_tick_get_ms(); if (cnt - cnt_bef 1000) { cnt_bef cnt; uart0_printf(sys_tick_get_ms(): %d\n, cnt); } } return 0; }功能就是1S周期打印tick值判断定时器是否准确~编译烧录运行3.3 完善SDRAM测试程序我们也把之前的SDRAM的测试程序给做完善将原来TODO注释的部分给实现// -- 记录 start_time -- uint32_t start_time sys_tick_get_ms(); for (i 0; i words_1MB; i) { pDst[i] pSrc[i]; } // -- 记录 end_time计算 MB/s -- uint32_t end_time sys_tick_get_ms(); printf( - 耗时: %d ms\r\n, end_time - start_time);编译、运行程序卡死了~这是为啥别急还记得之前我们将程序的栈空间移植到了SDRAM中了吗对应的.data段和.bss段也放倒了SDRAM的开头而SDRAM的测试程序第一步是要从SDRAM的开头写值一直写到SDRAM的结尾那么.data和.bss段直接就被覆盖了破坏了C程序的运行环境所以导致卡死不意外了~要怎么解决答案就是要跳过.data和.bss段并且减小总测试区域比如64MB→62MB防止把顶部栈空间也覆盖了// 宏定义 SDRAM 的基地址和容量 extern char __bss_end[]; #define SDRAM_BASE ((unsigned long)__bss_end) //0x30000000 #define SDRAM_SIZE_BYTES (62 * 1024 * 1024) // 62MB再次测试可以看到1MB的读写耗时也打印出来了原来真的有2S这样慢~

相关文章:

013.定时器之系统Tick实现|千篇笔记实现嵌入式全栈/裸机篇

⚠️裸机仓库:https://gitee.com/simonchina_carel_li/mini2440-bare-metal.git ⚠️Tag: 13-sys-tick 1. 为什么要系统Tick? 在前面的SDRAM测试程序中(), 我们有这样的部分, // -- TODO: 如果你有定时器…...

Java虚拟线程落地避坑指南(生产环境血泪总结:从Spring Boot 3.3集成到Project Loom异常传播链断裂修复)

第一章:Java 25虚拟线程核心原理与高并发演进全景Java 25正式将虚拟线程(Virtual Threads)从预览特性转为标准特性,标志着JVM并发模型进入轻量级线程时代。虚拟线程由JVM在用户态调度,底层复用有限的平台线程&#xff…...

012.整体框架适配SDRAM|千篇笔记实现嵌入式全栈/裸机篇

⚠️裸机仓库:https://gitee.com/simonchina_carel_li/mini2440-bare-metal.git ⚠️Tag: 11-sdram-apply 1. 这次要做什么? 我们已经完成了sdram的初始化,现在sdram已经可以使用了 我们之前的固件,栈空间是跑在SOC内置的4KB的S…...

粉紫系超人气月兔铃仙救

1 安装与初始化 # 全局安装 OpenSpec npm install -g fission-ai/openspeclatest # 在项目目录下初始化 cd /path/to/your-project openspec init 初始化时,OpenSpec 会提示你选择使用的 AI 工具(Claude Code、Cursor、Trae、Qoder 等)。 3 O…...

零代码实现企业级打印模板设计:vue-plugin-hiprint全攻略

零代码实现企业级打印模板设计:vue-plugin-hiprint全攻略 【免费下载链接】vue-plugin-hiprint hiprint for Vue2/Vue3 ⚡打印、打印设计、可视化设计器、报表设计、元素编辑、可视化打印编辑 项目地址: https://gitcode.com/gh_mirrors/vu/vue-plugin-hiprint …...

ESXi 自动加入 vCenter:Kickstart 脚本高效部署指南

在虚拟化集群部署中,手动将 ESXi 主机加入 vCenter Server 不仅繁琐,还容易出现配置失误,尤其适用于大规模集群搭建场景。本教程将介绍一种基于 Pyvmomi 工具的优化方案,无需依赖外部复杂环境,直接通过 ESXi Kickstart…...

VCF 私有 AI 服务(PAIS)自签名 TLS 证书配置避坑指南

在实验室或概念验证环境中,自签名 TLS 证书是 VCF 私有 AI 服务(PAIS)部署的常用选择,但常因底层库验证机制差异引发各类报错。本文针对 PAIS 部署中两类高频证书问题 ——API 容器启动失败与 Harbor 模型推送报错,拆解报错根源,提…...

Springboot 实现多数据源(PostgreSQL 和 SQL Server)连接父

一、环境准备 Free Spire.Doc for Python 是免费 Python 文档处理库,无需依赖 Microsoft Word,支持 Word 文档的创建、编辑、转换等操作,其中内置的 Markdown 解析能力,能高效实现 Markdown 到 Doc/Docx 格式的转换,且…...

Accio Work 全面解析:从免费白嫖到2000积分时代

Accio Work 全面解析:从免费白嫖到2000积分时代阿里国际推出的企业级 AI Agent 平台,能自主帮你做生意,但它真的免费吗?一、什么是 Accio Work?2026年3月24日,阿里国际在海外正式发布了一款名为 Accio Work…...

被遗忘的宝藏:深度挖掘一款停更20年的神器——拖把更名器

在软件的海洋中,有这样一类特殊的存在:它们并非出自大公司之手,也没有大规模的商业推广,却凭借着优秀的设计和实用的功能,在用户中口口相传。 它们可能已经停更多年,在主流软件平台上难觅踪迹,但…...

从手写试卷到智能评分:OCRAutoScore如何重塑教育评估体验

从手写试卷到智能评分:OCRAutoScore如何重塑教育评估体验 【免费下载链接】OCRAutoScore OCR自动化阅卷项目 项目地址: https://gitcode.com/gh_mirrors/oc/OCRAutoScore 作为一名教育工作者,你是否曾为堆积如山的试卷批改而苦恼?每学…...

【仅限首批200位工程师开放】工业PHP网关配置诊断工具包(含自动巡检脚本+配置熵值评分模型+整改优先级热力图)

第一章:工业PHP网关配置的演进与工程挑战工业级PHP网关已从早期的简单NginxPHP-FPM反向代理,演进为集路由分发、协议转换、熔断限流、可观测性注入于一体的复合中间件层。这一演进在提升系统弹性的同时,也带来了配置复杂度指数级上升、多环境…...

Spring WebFlux vs 虚拟线程:同一微服务压测对比(RPS 22,400 vs 38,900),为什么你该立刻停用响应式编程?

第一章:Java 25虚拟线程演进全景与高并发架构新范式Java 25正式将虚拟线程(Virtual Threads)从预览特性转为标准特性,并深度整合至java.util.concurrent、java.net和java.io等核心模块,标志着JVM并发模型从“OS线程绑定…...

为什么92%的农业SaaS平台在PHP可视化环节失败?资深农科院IT总监深度复盘3大技术黑洞

第一章:农业SaaS平台PHP可视化失败的全局图谱农业SaaS平台在落地过程中,常将数据可视化模块交由PHP后端直接渲染图表,却普遍遭遇响应延迟、内存溢出、图表错位及跨设备兼容性断裂等系统性失败。这些失败并非孤立缺陷,而是技术选型…...

从零入门性能测试:理论+JMETER实操,看完就能上手怯

一、环境准备 Free Spire.Doc for Python 是免费 Python 文档处理库,无需依赖 Microsoft Word,支持 Word 文档的创建、编辑、转换等操作,其中内置的 Markdown 解析能力,能高效实现 Markdown 到 Doc/Docx 格式的转换,且…...

虚拟线程性能拐点在哪?JVM 25.0.1+GraalVM+Linux eBPF监控实录,8大生产环境反模式曝光,现在不看下周就踩坑!

第一章:虚拟线程性能拐点的理论边界与工程定义虚拟线程(Virtual Thread)作为 JDK 21 引入的轻量级并发抽象,其性能优势并非在所有负载场景下线性增长。当调度密度、I/O 阻塞率与平台线程(Platform Thread)资…...

分布式训练有望解决人工智能的能耗难题

人工智能正面临着巨大的能源消耗挑战。这种持续增长的能源需求体现在支撑AI繁荣的数据中心产生的巨大碳足迹,以及前沿AI模型训练所产生的碳排放量随时间稳步增加。难怪大型科技公司开始青睐核能,设想一个由可靠、无碳能源支撑的未来。但是,虽…...

群晖Video Station元数据插件全攻略:从部署到优化的完整指南

群晖Video Station元数据插件全攻略:从部署到优化的完整指南 【免费下载链接】syno-videoinfo-plugin A simple web scraping plugin for Synology Video Station 项目地址: https://gitcode.com/gh_mirrors/sy/syno-videoinfo-plugin 元数据插件是群晖Video…...

G-Helper技术架构深度解析:华硕笔记本底层硬件控制实现机制

G-Helper技术架构深度解析:华硕笔记本底层硬件控制实现机制 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Stri…...

Spring Boot 4.0 Agent-Ready架构深度实践(生产环境千万级QPS下的字节码注入稳定性白皮书)

第一章:Spring Boot 4.0 Agent-Ready架构全景概览Spring Boot 4.0标志着Java可观测性与运行时可编程能力的重大演进。其核心设计理念是原生支持JVM Agent集成,无需侵入式代码修改即可实现字节码增强、指标采集、分布式追踪注入和动态配置生效。Agent-Rea…...

网络爬虫是自动从互联网上采集数据的程序网络爬虫是自动从互联网上采集数据的程序,Python凭借其丰富的库生态系统和简洁语法,成为了爬虫开发的首选语言。本文将全面介绍

网络爬虫是自动从互联网上采集数据的程序网络爬虫是自动从互联网上采集数据的程序,Python凭借其丰富的库生态系统和简洁语法,成为了爬虫开发的首选语言。本文将全面介绍如何使用Python构建高效、合规的网络爬虫。一、爬虫基础与工作原理 网络爬虫本质上是…...

JMS, ActiveMQ 学习一则唾

开发个什么Skill呢? 通过 Skill,我们可以将某些能力进行模块化封装,从而实现特定的工作流编排、专家领域知识沉淀以及各类工具的集成。 这里我打算来一次“套娃式”的实践:创建一个用于自动生成 Skill 的 Skill,一是用…...

solidworks异形孔槽口改方向

...

深夜告警炸裂?这份Linux故障排查“作战地图”请收好惨

先唠两句:参数就像餐厅点单 把API想象成一家餐厅的“后厨系统”。 ? 路径参数/dishes/{dish_id} -> 好比你要点“宫保鸡丁”这道具体的菜,它是菜单(资源路径)的一部分。查询参数/dishes?spicytrue&typeSichuan -> 好比…...

业务与技术沟通低效?JVS-Rules规则引擎如何让协作更顺畅

一、协作之痛:业务与技术“鸡同鸭讲”,规则落地慢如蜗牛 很多企业都有这个困境:业务人员最懂规则(比如风控准入、会员权益、计费逻辑),但不会写代码;技术人员能写代码,但不懂业务细…...

【PHP 8.9 JIT调试终极指南】:20年核心开发者亲授3大避坑法则、4类典型崩溃现场还原与实时调优SOP

第一章:PHP 8.9 JIT 调试的认知革命与时代意义 PHP 8.9 并非官方发布的正式版本(截至 PHP 官方最新稳定版为 8.3),但作为思想实验中的“前瞻性 JIT 调试范式”,它象征着 PHP 运行时调试能力的一次质变跃迁——将传统基…...

Hugging Face分词超快

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 高效分词引擎:NLP处理速度的革命性突破目录高效分词引擎:NLP处理速度的革命性突破 引言:分词…...

Qwen2-VL-2B-Instruct效果对比:与传统卷积神经网络图像分类的差异

Qwen2-VL-2B-Instruct效果对比:与传统卷积神经网络图像分类的差异 最近在和朋友聊起图像识别技术时,他提了个挺有意思的问题:“现在这些新的AI模型,和以前那种能认出猫猫狗狗的‘老办法’到底有啥不一样?” 他说的“老…...

vLLM-v0.17.1部署案例:跨境电商多语言商品描述生成系统落地

vLLM-v0.17.1部署案例:跨境电商多语言商品描述生成系统落地 1. 项目背景与需求分析 跨境电商平台面临着一个共同挑战:如何高效生成多语言商品描述。传统人工撰写方式存在以下痛点: 语言障碍:需要雇佣多语种文案人员成本高昂&am…...

0408晨间日记

- 关键词- - 上午- batam新的案子的评估- 资料全不全- 钢网层- 坐标档- bom的查询- 查询每个材料形状- 能不能生产- 细节 -材料特性- 制作炉温曲线- bom提取的方案- pdf转excel- 人工再核对一下- ai搜索再次纠错- 数字的1和字母的l是区分不出来的- cad坐标提取- 资料确实没有c…...