单任务程序典型架构&中断服务程序

单任务程序典型架构 
 
  (1)从CPU复位时的指定地址开始执行;
 
  (2)跳转至汇编代码startup处执行;
 
  (3)跳转至用户主程序main执行,在main中完成:
 
   a.初试化各硬件设备; 
 
   b.初始化各软件模块;
 
   c.进入死循环(无限循环),调用各模块的处理函数
 
    用户主程序和各模块的处理函数都以C语言完成。用户主程序最后都进入了一个死循
环,其首选方案是:
while(1)
{
}


   中断服务程序 
 
    中断是嵌入式系统中重要的组成部分,但是在标准 C 中不包含中断。许多编译开发商
在标准 C 上增加了对中断的支持,提供新的关键字用于标示中断服务程序(ISR),类似于
__interrupt、#program interrupt 等。当一个函数被定义为 ISR 的时候,编译器会自动为该函
数增加中断服务程序所需要的中断现场入栈和出栈代码。
 
    中断服务程序需要满足如下要求:
 
   (1)不能返回值;
 
   (2)不能向 ISR 传递参数;
 
   (3) ISR 应该尽可能的短小精悍;
 
   (4) printf(char * lpFormatString,…)函数会带来重入和性能问题,不能在 ISR 中采用。
 
    在某项目的开发中,我们设计了一个队列,在中断服务程序中,只是将中断类型添加入
该队列中,在主程序的死循环中不断扫描中断队列是否有中断,有则取出队列中的第一个中断类型,进行相应处理。

//出入均设有缓冲区,大小可任意设置。 //可供使用的函数名: //char getbyte(void);从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。 //getline(char idata *line, unsigned char n); 获取一行数据回车结束,必须定义最大输入字符数 //putbyte(char c);放入一个字节到发送缓冲区 //putbytes(unsigned char *outplace,j);放一串数据到发送缓冲区,自定义长度 //putstring(unsigned char code *puts);发送一个定义在程序存储区的字符串到串口 //puthex(unsigned char c);发送一个字节的hex码,分成两个字节发。 //putchar(uchar c,uchar j);输出一个无符号字符数的十进制表示,必须标示小数点的位置,自动删除前面无用的零 //putint(uint ui,uchar j);输出一个无符号整型数的十进制表示,必须标示小数点的位置,自动删除前面无用的零 //delay(unsigned char d); 延时n x 100ns //putinbuf(uchar c);人工输入一个字符到输入缓冲区 //CR;发送一个回车换行 //************************************************************************* #include <w77e58.h> #define uchar unsigned char #define uint unsigned int #define OLEN 32 /* size of serial transmission buffer */ idata unsigned char outbuf[OLEN]; /* storage for transmission buffer */ unsigned char idata *outlast=outbuf; //最后由中断传输出去的字节位置 unsigned char idata *putlast=outbuf; //最后放入发送缓冲区的字节位置 #define ILEN 12 /* size of serial receiving buffer */ idata unsigned char inbuf[ILEN]; unsigned char idata *inlast=inbuf; //最后由中断进入接收缓冲区的字节位置 unsigned char idata *getlast=inbuf; //最后取走的字节位置 bit outbufsign0; //最后一个数据覵BUF发完标志 发完=0 bit outbufsign; //输出缓冲区非空标志 有=1 bit inbufsign; //接收缓冲区非空标志 有=1 bit inbufful; //输入缓冲区满标志 满=1 #define CR putstring("\r\n") //CR=回车换行 //***************************** //延时n x 100ns void delay(unsigned char d) //在源程序开头定义是否用w77e58或22。1184M晶振 {unsigned char j; do{ d--; //110592 &amp; 89c52 #ifndef cpuw77e58 #ifndef xtal221184 j=21; //k=38 cpu80320 100us k="21" cpu 8052 #else j=42; #endif #else #ifndef xtal221184 j=38; #else j=76;
### TC399 FreeRTOS AMP 配置指南 #### 关于TC399和FreeRTOS AMP简介 TC399是一款多核处理器,支持异构多处理架构(AMP),允许不同内核运行不同的操作系统或相同操作系统的多个实例。FreeRTOS是一种轻量级实时操作系统(RTOS)[^1]。 #### 获取相关文档和技术资料 为了获取与TC399和FreeRTOS AMP配置有关的技术资料或教程文档,建议访问官方资源网站以及社区论坛。通常这类特定硬件平台的操作系统移植和支持材料会由芯片制造商提供详细的指导手册和应用笔记。对于NXP的TC399系列,可以从NXP官方网站下载最新的数据表、用户手册和其他技术支持文件[^2]。 #### 安装环境准备 当涉及到设置开发环境时,可以参照类似嵌入式项目的初始化流程来构建工作区。例如,在集成FreeRTOS至项目中,需复制必要的头文件到指定位置以便编译器能够识别这些接口定义。针对TC399这样的复杂SoC,可能还需要额外安装交叉编译工具链,并确保其路径已正确加到环境变量中。 #### 移植FreeRTOS到TC399上实现AMP模式 要使能AMP特性,则需要对FreeRTOS进行适当修改以适应目标板的具体需求。这包括但不限于调整内存映射、中断控制器配置等方面的工作。具体来说: - **创建独立的任务调度域**:为每个核心分配单独的任务列表并管理各自的时间片轮转。 - **同步机制设计**:考虑到跨CPU间的通信效率问题,应该选用高效的IPC(进程间通讯)方式如邮箱(mailbox)或者消息队列(queue)等。 - **启动脚本编写**:编写引导加载程序负责唤醒次级core(s),并将它们指向各自的入口点执行相应的应用程序逻辑。 ```c // 示例代码片段展示如何通过汇编指令切换到另一个ARM Cortex-A core去运行新的线程 __attribute__((naked)) void StartSecondaryCore(void){ __asm volatile ( "ldr r0, =secondary_core_entry_point\n" "mov pc, r0\n" : /* no output operands */ : /* no input operands */ : "r0"); } ``` #### 测试验证阶段 最后一步是在实际设备上部署固件镜像并通过一系列测试案例确认整个系统的稳定性和性能表现是否满足预期要求。如果遇到任何异常情况,比如串口DMA传输过程中发生阻塞现象,可以通过查阅STM32 HAL库的相关API说明寻找解决方案[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值