完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
问题如下:当系统滴答时钟中断时,会调用xTaskIncrementtick(),请问调用此函数时,函数开始几行定义的变量:
TCB_t * pxTCB; TickType_t xItemValue; BaseType_t xSwitchRequired = pdFALSE; 是存放在哪里?PSP?还是MSP?(或者说当前被中断的任务的栈) 不知道这个是不是Cortex-M3相关的内容? 谢谢指教! |
|
相关推荐
7个回答
|
|
中断服务函数使用的是MSP指针,MSP操作的是主栈,所以这些变量是存在主栈中的
|
|
|
|
那用户自己创建的任务里定义的局部变量是用的PSP吗?存放在任务堆栈区是吧?
main.c里main()之前定义的全局变量函数和 用户写的*.c文件里定义的全局变量又用的什么指针? |
|
|
|
谢谢左老师,通过在调试查看进入中断后的SP和当前MSP的关系了解了是这样,
但我在网上找了一个人在STM8S上移植的FreeRTOS例程,通过IAR在线调试查看Memery发现,中断服务函数使用的栈是当前被中断的任务的栈(基本上是idletask的栈),,,若要在STM8中移植FreeRTOS的话,是否只能这样做呢???下面是我找的例程移植的汇编部分。 SECTION `.far_func.text`:CODE portSAVE_CONTEXT MACRO push ?b8 ; Now store the rest of the registers. Dont store the ... push ?b9 ; ... the stack pointer register here push ?b10 ; stack pointer and will get saved into the TCB. push ?b11 ; Note: These are not the actual registers of STM8 core push ?b12 ; These are vertual registers used by IAR compiler push ?b13 push ?b14 push ?b15 ld a, uxCriticalNesting ; Store the critical nesting counter. You may have to use ldf push a ldw x, pxCurrentTCB ; Finally save the stack pointer register ldw y, sp ; into the TCB. ldw (x), y ENDM ;------------------------------------------------------------------------------- portRESTORE_CONTEXT MACRO ldw x, pxCurrentTCB ; Restore the software stack pointer from ... ldw x, (x) ; the TCB into the stack pointer register ldw sp, x pop a ld uxCriticalNesting, a ; Store the critical nesting counter. pop ?b15 pop ?b14 pop ?b13 pop ?b12 pop ?b11 pop ?b10 pop ?b9 pop ?b8 iret ; ... scheduler decided should run. ENDM ; vPortYield() and vPortYieldFromTick() ; ------------------------------------- ; ; Manual and preemptive context switch functions respectively. ; The IAR compiler does not fully support inline assembler, ; so these are implemented here rather than the more usually ; place of within port.c. ;------------------------------------------------------------------------------- vPortYield: push #$0 pushw y pushw x push a push cc sim ;Disable interrupts portSAVE_CONTEXT ; Save the context of the current task. call vTaskSwitchContext ; Call the scheduler. portRESTORE_CONTEXT ; Restore the context of whichever task the ... ;---------------------- vPortYieldFromTick: LD A, #$1 ; Clear the Timer 1 IT pending Bit CPL A ; TIM1->SR1 = (uint8_t)(~(uint8_t)TIM1_IT); LD L:0x52b6,A sim ;Disable interrupts portSAVE_CONTEXT ; Save the context of the current task. call xTaskIncrementTick ; Call the timer tick function. tnz a jreq SkipTaskSwitch call vTaskSwitchContext ; Call the scheduler. SkipTaskSwitch: portRESTORE_CONTEXT ; Restore the context of whichever task the ... ;------------------------------------------------------------------------------- ; vPortStart() ; ------------ ; ; Again due to the lack of inline assembler, this is required ; to get access to the portRESTORE_CONTEXT macro. vPortStart: portRESTORE_CONTEXT |
|
|
|
1、自己创建的任务里定义的局部变量是用的PSP;
2、main.c里main()之前定义的全局变量函数和 用户写的*.c文件里定义的全局变量是存放在静态数据区,直接访问; |
|
|
|
请再看看四楼哈
|
|
|
|
静态数据区 ?是个什么东东?与任务的堆栈区 有啥不同?放在哪里? 都是在flash里 还是ram? 我概念不清,帮我理理?
|
|
|
|
静态数据区你可以查资料了解下。
静态数据区的数据是编译器编译完成就确定了的,与任务堆栈区一样都是在RAM里面。 变量存储位置有关的细节可以了解了解我的一篇博客哈:http://blog.sina.com.cn/s/blog_b315f69b0102x2c3.html |
|
|
|
只有小组成员才能发言,加入小组>>
798 浏览 0 评论
1154 浏览 1 评论
2531 浏览 5 评论
2863 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2713 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1083浏览 3评论
195浏览 2评论
461浏览 2评论
374浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
455浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 22:23 , Processed in 1.178211 second(s), Total 91, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号