freeRTOS 在 BlackFin533 平台上的移植 (1)

本文介绍了作者将freeRTOS操作系统成功移植到多年未使用的BlackFin533平台上,经过20天的努力,实现了4个任务的运行。文章详细讲述了移植过程中涉及的汇编代码,包括入栈出栈处理以及启动任务时调用的汇编函数。在创建任务时,pxPortInitialiseStack()函数用于初始化堆栈,然后通过vTaskSwitchContext()找到最高优先级任务并切换上下文。
摘要由CSDN通过智能技术生成

这块板子在手上有好几年了,还是在上家公司的时候,vender送给我。

吃灰吃了这么多年,最近花了二十天的时间把freeRTOS给移植到上面去了。

总共运行了四个task,后面会把关键的代码给贴出来。


1. 这段汇编代码是主要是做入栈和出栈处理的。

#define CPU_SAVE_CONTEXT()\
	[ --sp ]	= rets;\
	[ --sp ] 	= fp;\
	[ --sp ] 	= astat;\
	[--sp] = (r7:0, p5:0);\
	[--sp] = lc0;\
	[--sp] = lc1;\
	[--sp] = lt0;\
	[--sp] = lt1;\
	[--sp] = lb0;\
	[--sp] = lb1;\
	[--sp] = a0.W;\
	[--sp] = a0.X;\
	[--sp] = a1.W;\
	[--sp] = a1.X;\
	[--sp] = i0;\
	[--sp] = i1;\
	[--sp] = i2;\
	[--sp] = i3;\
	[--sp] = b0;\
	[--sp] = b1;\
	[--sp] = b2;\
	[--sp] = b3;\
	[--sp] = l0;\
	[--sp] = l1;\
	[--sp] = l2;\
	[--sp] = l3;\
	[--sp] = m0;\
	[--sp] = m1;\
	[--sp] = m2;\
	[--sp] = m3;
	
#define CPU_RESTORE_CONTEXT() \
	m3 = [sp++];\
	m2 = [sp++];\
	m1 = [sp++];\
	m0 = [sp++];\
	l3 = [sp++];\
	l2 = [sp++];\
	l1 = [sp++];\
	l0 = [sp++];\
	b3 = [sp++];\
	b2 = [sp++];\
	b1 = [sp++];\
	b0 = [sp++];\
	i3 = [sp++];\
	i2 = [sp++];\
	i1 = [sp++];\
	i0 = [sp++];\
	a1.X = [sp++];\
	a1.W = [sp++];\
	a0.X = [sp++];\
	a0.W = [sp++];\
	lb1 = [sp++];\
	lb0 = [sp++];\
	lt1 = [sp++];\
	lt0 = [sp++];\
	lc1 = [sp++];\
	lc0 = [sp++];\
	(r7:0, p5:0) = [sp++];\
	astat		= [ sp++ ];\
	fp 			= [ sp++ ];\
	rets 		= [ sp++ ];


2. 下面这段代码是OS在create几个task后,需要启动第一个task要调用的汇编函数。

    a)每个task在create的时候,都会调用prvInitialiseNewTask()函数,在该函数内部会调用pxPortInitialiseStack()函数进行stack的初始化。

    b)在每个task的stack初始化完成后,该stack会在后续的以下汇编函数中进行使用。

    c)函数pxPortInitialiseStack()进行stack的初始化的顺序比如和上面代码1中入栈宏的操作顺序一致。

//==========================================================================================
//  Function:
//      this function OSStartHighRdy() will be called only one time.
//      the OS will select a highest priority task to start for the first time.
//==========================================================================================
.global _OSStartHighRdy;


_OSStartHighRdy:

    // need to save RETS since _OSStartHighRdy never returns	

    // Get the SP for the highest ready task
    p1.L    = _pxCurrentTCB;
    p1.H    = _pxCurrentTCB;
    p2 	    = [ p1 ];
    sp 	    = [ p2 + 0 ];
    nop; nop; nop;

    sp      += 4;
    									
    // Restore CPU context
    CPU_RESTORE_CONTEXT()						

    // Return to high ready task
    rts;

_OSStartHighRdy.end:

3. 下面的函数是进行任务切换的核心函数,主要操作如下:

    a) 先进行当前任务的context信息的保存

    b) 调用vTaskSwitchContext() 函数,找到highest priority的任务

    c) 将找到的任务的context信息切入。

    d) 函数返回到新切入的任务,同时,rti汇编会打开中断。

    e) 为了代码简便,该函数没有处理当找到的高优先级任务就是当前任务时的处理方式。

//==========================================================================================
// Function:
//   This function is called to switch the context of the current running task
//   This function is registered as the IVG14 handler and will be called to handle both 
//                  interrupt and task level context switches.
//==========================================================================================

.global _OSCtxSw;

_OSCtxSw:

    // Save context, interrupts disabled by IPEND[4] bit
    CPU_SAVE_CONTEXT()

    // The task Program Counter is in RETI, 
    // IPEND[4] is not cleared when it is stored
    // on the stack via an intermediate register like r1
    // so interrupts remain disabled 
    r1        = reti;
    [ --sp ]  = r1;								

    //p1 -> pxCurrentTCB
    p1.L      = _pxCurrentTCB;
    p1.H      = _pxCurrentTCB;
    p2        = [p1];      //p2 -> pxCurrentTCB->pxTopOfStack
    [p2]      = sp;        //store the switched out task's stack	

    // to get the higher priority task to switch in
    call      _vTaskSwitchContext;

    // Sometime the highest priority task is current task,
    // i still proceed here without skipping below code.
    // Get a highest ready task priority
    p3.L      = _pxCurrentTCB;	
    p3.H      = _pxCurrentTCB;
    p2        = [ p3 ];

    sp        = [ p2 + 0 ];	
    nop; nop; nop;
    	
    // Recover the start address of the task
    reti      = [ sp++ ];

    // Restoring CPU context
    CPU_RESTORE_CONTEXT()							

    // Reenable interrupts via IPEND[4] bit and return to task
    rti;													

_OSCtxSw.end:

今天的代码就更新到此。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值