学习ARM开发(21)

发布者:自在自由最新更新时间:2024-11-15 来源: cnblogs关键字:ARM开发 手机看文章 扫描二维码
随时随地手机看文章

       先要声明任务指针,因为后面需要使用。

       //任务指针.

volatile TASK_TCB* volatile g_pCurrentTask = NULL;

volatile TASK_TCB* volatile g_pCurrentTask1 = NULL;

volatile TASK_TCB* volatile g_pCurrentTask2 = NULL;

接着就需要初始化这些任务栈,用下面的代码进行初始化,为了简单,全部使用内存地址操作的方式,当然后面会改成动态地分配内存的方式。代码如下:

///////////////////////////////////////////////////////////////////////////////

//函数名称:   TaskInitStack

//函数功能:   分配任务的栈。

//输入参数:

//输出参数:

//返 回 值:   

//开发人员:   蔡军生

//时    间:   2006/02/26

//修改说明:  

//

///////////////////////////////////////////////////////////////////////////////

void TaskInitStack(void)

{

       g_pCurrentTask1 = (PTASK_TCB)0x0c700000;

       g_pCurrentTask1->pStackStart = (UINT*)(0x0c700000+0x200);

       g_pCurrentTask1->pStackTop = g_pCurrentTask1->pStackStart + 0x100;

 

       g_pCurrentTask2 = (PTASK_TCB)(0x0c700000 + 0x400);

       g_pCurrentTask2->pStackStart = (UINT*)(0x0c700000+0x400 + 0x200);

       g_pCurrentTask2->pStackTop = g_pCurrentTask2->pStackStart + 0x100;

}

 

接着再创建两个简单的任务,它们都是输出一行字符串,就等待一会,代码如下:

//

void TaskTest1(void)

{    

       for(;;)

       {

              Lock();

              puts('TaskTest1/n');

              UnLock();

 

              SoftDelay(100);

       }

}

//

void TaskTest2(void)

{    

       for(;;)

       {

              Lock();

              puts('TaskTest2/n');

              UnLock();

 

              SoftDelay(100);

       }

}

 

然后再初始化任务栈,代码如下:

void TaskStart(void)

{

      

       //

       UINT* pTemp = g_pCurrentTask1->pStackTop;

       //

       *g_pCurrentTask1->pStackTop =  (UINT)TaskTest1;

       g_pCurrentTask1->pStackTop--;

 

       *g_pCurrentTask1->pStackTop = (UINT)0x14141414; /* R14 */

       g_pCurrentTask1->pStackTop--;

 

//       *g_pCurrentTask1->pStackTop = (UINT)pTemp;       /* R13 */

//       g_pCurrentTask1->pStackTop--;

 

       *g_pCurrentTask1->pStackTop = (UINT)0x12121212; /* R12 */

       g_pCurrentTask1->pStackTop--;

 

       *g_pCurrentTask1->pStackTop = (UINT)0x11111111;   /* R11 */

       g_pCurrentTask1->pStackTop--;

 

       *g_pCurrentTask1->pStackTop = (UINT)0x10101010; /* R10 */

       g_pCurrentTask1->pStackTop--;

 

       *g_pCurrentTask1->pStackTop = (UINT)0x09090909; /* R9 */

       g_pCurrentTask1->pStackTop--;

 

       *g_pCurrentTask1->pStackTop = (UINT)0x08080808; /* R8 */

       g_pCurrentTask1->pStackTop--;

 

       *g_pCurrentTask1->pStackTop = (UINT)0x07070707; /* R7 */

       g_pCurrentTask1->pStackTop--;

 

       *g_pCurrentTask1->pStackTop = (UINT)0x06060606; /* R6 */

       g_pCurrentTask1->pStackTop--;

 

       *g_pCurrentTask1->pStackTop = (UINT)0x05050505; /* R5 */

       g_pCurrentTask1->pStackTop--;

 

       *g_pCurrentTask1->pStackTop = (UINT)0x04040404; /* R4 */

       g_pCurrentTask1->pStackTop--;

 

       *g_pCurrentTask1->pStackTop = (UINT)0x03030303; /* R3 */

       g_pCurrentTask1->pStackTop--;

 

       *g_pCurrentTask1->pStackTop = (UINT)0x02020202; /* R2 */

       g_pCurrentTask1->pStackTop--;

 

 

       *g_pCurrentTask1->pStackTop = (UINT)0x01010101; /* R1 */

       g_pCurrentTask1->pStackTop--;

 

       *g_pCurrentTask1->pStackTop = (UINT)0;       /* R0 */

       g_pCurrentTask1->pStackTop--;

 

       *g_pCurrentTask1->pStackTop = (UINT)0x13;  /* SPSR */

 

 

       //

       //

       //

       pTemp = g_pCurrentTask2->pStackTop;

       //

       *g_pCurrentTask2->pStackTop =  (UINT)TaskTest2;

       g_pCurrentTask2->pStackTop--;

 

       *g_pCurrentTask2->pStackTop = (UINT)0x14141414; /* R14 */

       g_pCurrentTask2->pStackTop--;

 

//       *g_pCurrentTask2->pStackTop = (UINT)pTemp;       /* R13 */

//       g_pCurrentTask2->pStackTop--;

 

       *g_pCurrentTask2->pStackTop = (UINT)0x12121212; /* R12 */

       g_pCurrentTask2->pStackTop--;

 

       *g_pCurrentTask2->pStackTop = (UINT)0x11111111;   /* R11 */

       g_pCurrentTask2->pStackTop--;

 

       *g_pCurrentTask2->pStackTop = (UINT)0x10101010; /* R10 */

       g_pCurrentTask2->pStackTop--;

 

       *g_pCurrentTask2->pStackTop = (UINT)0x09090909; /* R9 */

       g_pCurrentTask2->pStackTop--;

 

       *g_pCurrentTask2->pStackTop = (UINT)0x08080808; /* R8 */

       g_pCurrentTask2->pStackTop--;

 

       *g_pCurrentTask2->pStackTop = (UINT)0x07070707; /* R7 */

       g_pCurrentTask2->pStackTop--;

 

       *g_pCurrentTask2->pStackTop = (UINT)0x06060606; /* R6 */

       g_pCurrentTask2->pStackTop--;

 

       *g_pCurrentTask2->pStackTop = (UINT)0x05050505; /* R5 */

       g_pCurrentTask2->pStackTop--;

 

       *g_pCurrentTask2->pStackTop = (UINT)0x04040404; /* R4 */

       g_pCurrentTask2->pStackTop--;

 

       *g_pCurrentTask2->pStackTop = (UINT)0x03030303; /* R3 */

       g_pCurrentTask2->pStackTop--;

 

       *g_pCurrentTask2->pStackTop = (UINT)0x02020202; /* R2 */

       g_pCurrentTask2->pStackTop--;

 

       *g_pCurrentTask2->pStackTop = (UINT)0x01010101; /* R1 */

       g_pCurrentTask2->pStackTop--;

 

       *g_pCurrentTask2->pStackTop = (UINT)0;       /* R0 */

       g_pCurrentTask2->pStackTop--;

 

       *g_pCurrentTask2->pStackTop = (UINT)0x13;  /* SPSR */

      

       //设置首先运行的任务是1.

       g_pCurrentTask = g_pCurrentTask1;

}

代码初始化了两个任务栈后,接着设置第一个任务为优先运行的任务。

 

最后就需要进行中断任务调度任务进行运行了,代码如下:

///////////////////////////////////////////////////////////////////////////////

//函数名称:   EIntTickIsr

//函数功能:   时钟中断函数。

//输入参数:

//输出参数:

//返 回 值:    

//开发人员:   蔡军生

//时    间:   2006/02/26

//修改说明:  

//

///////////////////////////////////////////////////////////////////////////////

[1] [2]
关键字:ARM开发 引用地址:学习ARM开发(21)

上一篇:学习ARM开发(20)
下一篇:学习ARM开发(22)

推荐阅读最新更新时间:2026-03-24 11:06

OK6410A 开发板 (八) 119 linux-5.11 OK6410A arm-linux的
硬件上: armv6 有 6个 R13 R13_usr 和 R13_sys 是同一个 还有 R13_svc R13_abt R13_und R13_irq R13_fiq 软件上 linux boot时有一个栈 linux 各种异常处理有栈(5个异常模式,1个system模式) 对应多少个栈? svc mode 对应每个进程有一个栈? irq mode 是固定的栈? abort 呢? und 呢 ? fiq 呢? system mode 呢? linux 在 user mode 时 有栈 , (应用程序的栈,每个应用程序有一个栈,有N个应用程序) boot的栈不管,没啥意思 从线程和异常来说事 1.
[单片机]
IAR开发平台升级Arm和RISC-V开发工具链,加速现代嵌入式系统开发
瑞典乌普萨拉,2025年6月10日 — 全球领先的嵌入式软件解决方案供应商IAR正式发布其旗舰产品的重大更新版本: Arm开发工具链v9.70和RISC-V开发工具链v3.40,大幅提升了IAR开发平台在性能、安全性和自动化方面的能力,助力汽车、工业、医疗和物联网等行业中的敏捷、可扩展嵌入式应用。 为应对嵌入式系统日益增长的复杂性,全新的IAR开发工具链支持云端许可、CI/CD管道集成和多种架构的开发。随着Arm和RISC-V持续推动技术演进,IAR推出统一的开发平台,提供高质量且具安全保障的开发体验。新版本帮助客户提升研发效率、降低研发成本、缩短产品上市时间,从而使复杂的嵌入式系统开发更具可预测性和可扩展性。 IAR首席
[嵌入式]
IAR<font color='red'>开发</font>平台升级<font color='red'>Arm</font>和RISC-V<font color='red'>开发</font>工具链,加速现代嵌入式系统<font color='red'>开发</font>
Windows Arm64 托管运行器正式支持 GitHub Actions,加速开发流程
过去一年, Arm 与 GitHub 持续紧密合作,致力于为基于 Arm 平台的开发者打造更便捷、更高效的开发体验 。GitHub 推出的 Arm 托管运行器正在革新应用程序的开发与部署流程,而近期推出的面向 GitHub Copilot 的 Arm 扩展程序,更是进一步简化并加速了向 Arm 架构服务器的迁移过程。双方的共同努力正在赋能开发者,使其能够在 Arm 平台上进行更快、更智能和更高效的开发工作。 近日,Arm 宣布双方合作进程的又迎来一个里程碑:Windows Arm64 托管运行器现已正式支持 GitHub Actions,为 Arm64 Windows 应用程序提供原生 CI/CD 管线支持——无需借助仿真运行
[网络通信]
iTOP-4418开发板Ubuntu12.04-arm系统升级
基于迅为iTOP-4418开发板 EC20 模块封装成标准的 PCIe 接口,和开发板主要通过 usb 通讯。 此次提供的文件有 pppd 源码、编译好的 chat 和 pppd 工具、wcdma,wcdma_back,wcdma-chat- connect、wcdma-chat-disconnect 以及要在文档最后使用的 pppd_conf.sh 脚本,如下图所示。 在进行编译之前要先修改编译器为 arm-2009q3 编译器,如何设置编译器参见手册 5.2.2 “交叉编译工具的安装”。另外为了避免使用环境变量设置编译器而可能出现的问题,文档中大部分编译是使用编译器的绝对路径,用户也应先找到自己编译器的绝对路径待用。下图是本
[单片机]
iTOP-4418<font color='red'>开发</font>板Ubuntu12.04-<font color='red'>arm</font>系统升级
嵌入式开发学习(1)<ARM体系结构>
内核版本号 SoC版本号 芯片型号(三星) ARMv1 (这里的v表示version) ...... ARMv4 ARM7 S3C44B0 ARMv4 ARM9 S3C2440 S3C2410 ARMv5 ARM+XScale ARMv6 ARM11 S3C6410 ARMv7 Cortex-M(微) Cortex-A(应用) Cortex-R(实时) Cortex-A8 S5PV210 SP5C100 Cortex-A9 Exynos4412 Cortex-A7 全志A10 A20 A31 Cortex-A15 exynos5250 5450 Cortex
[单片机]
学习ARM开发(23)
三个任务准备与运行结果 下来看看创建任务和任运的栈空间怎么样的,以及运行输出。 Made in china by UCSDN(caijunsheng) Lichee 1.0.0 (Mar 12 2006 - 20:51:12) Lichee RTOS code: 0C100000 - 0C1021EC BSS: - 0C102228 上面这句说明执行代码开始位置和结束位置,以及全局数据的结束位置。 Init Finish! 这里就是初始化任务完成。 pTask=C102234 这里就分配第一个IDLE任务内存位置。 pTask- pStackStart=C10225C 这个是任务的栈底的位置。 pTask- pSt
[单片机]
学习ARM开发(22)
关闭中断与打开中断 中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西 ,但程序突然中断了,又让另外一个程序输出打印内容,这样在打印机上就会乱得不得了, 同时有两份以上的文件交错地打印在一张纸上。像不可剥夺的资源,就一定要关闭中断,让 它占有这个资源。在ARM里,没有像x86那样有清除中断指令CLI。那么在ARM里是怎么样实现 关中断和开中断的呢?下面就来看看ARM的关中断和开中断实现。 /////////////////////////////////////////////////////////////////////////////// //函数名称: Lock //函数功能: 关中断函数
[单片机]
学习ARM开发(20)
有了前面的Tick中断,那么基本的任务切换条件已经是“万事俱备,只欠东风”了。不过,这个“东风”也是很难搞得懂的,只有不断地通过实践才会找到合适的方法。现在我就需要去找这个东风了,就是解决不同的任务切换的问题。从简单到复杂,这是任何事物的认识过程,也是行之有效的方法。绝对不要一上来就搞一个很复杂的,因为人的理解能力还是有限的。最简单的任务切换,就是我需要实现的:只需要实现两个任务不断地来回切换,就已经说明可行了。那我先把这两个任务设置为最简单的,因此,就把任务的栈定下来,因为每个任务的栈是肯定不同的,所以我选择了固定地设置栈地址。比如第一个任务的栈地址是0x0c700000,第二个任务的栈地址是0x0c700200。接着就需要把任
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved