小编kal*_*czp的帖子

.s文件在C项目中的作用是什么?

我正在使用ARM Cortex M3芯片(STM32F2),ST提供"标准外设库".它有一些有用的.c和.h文件.它还有.s文件.

在C项目的上下文中这些.s文件的目的是什么?如何获取编译器/链接器/?把它们考虑进去?

c embedded stm32

22
推荐指数
2
解决办法
3万
查看次数

补偿ARM中断的延迟?

我正在研究STM32F4 CPU上的一个项目,产生信号.

我在STM32上有CPU时钟(没有预分频器)的通用定时器,在溢出时触发中断,然后用GPIO产生周期信号.

我需要在非常精确的时间触发GPIO(基本上低至一个CPU周期精度).通过设置优先级等,我已设法将此抖动减少到+ -5个周期,但这种抖动存在,具体取决于CPU的工作情况.

我需要补偿这几个周期的抖动.只要我在精确的时间切换GPIO,添加几个周期的延迟就不是问题.

我的想法是读取计数器的当前值,并有一个FIXED_NUMBER-CURRENT_VALUE时间的活动循环,确保我将在精确的时间退出循环.

然而,在C中做一个简单的循环 - 一个FOR循环,或一个while(counter-> value <TARGET)不起作用,因为它ADDS抖动而不是减少它.

我做错了什么/天真吗?我应该在集会中这样做吗?怎么会与C不同(我检查了用GCC反汇编来检查循环没有被优化掉,也不是我打了内存?)

(我确保空的,非优化的但不打击内存循环体)

编辑:在AVR上看到这个例子(我知道的更稳定)请参见示例http://lucidscience.com/pro-vga%20video%20generator-7.aspx (搜索"jitter")

edit2:我在汇编中尝试了一个简单的循环,例如(r0是我的计数器,等待的循环次数,在寄存器中)

loop : SUBS r0,#1 ; tried with 2 also
       BGE loop
Run Code Online (Sandbox Code Playgroud)

而且,如果没有它,抖动会更好.

总结起来,我已经知道我应该拖延多少.我只需要一种方法让代码分支在一个案例中可靠地消耗N个循环而在另一个案例中可以消耗M. 不幸的是,单独的分支似乎不起作用,因为管道填充似乎不需要可靠的循环次数,并且条件表达式也不会因为它们总是采用相同数量的循环(有时无效).

从RAM而不是闪存运行会提高一致性吗?(NB stm32f4有一个flash预取..)

counter arm interrupt stm32 low-latency

4
推荐指数
1
解决办法
2094
查看次数

STM32从用户闪存启动

STM32提供从用户闪存,系统内存和嵌入式SRAM启动的选项.在固件方面"从用户Flash启动"是否意味着执行自定义引导加载程序?

stm32 bootloader

2
推荐指数
1
解决办法
3271
查看次数

stm32 JTAG 引脚使用

我使用 SWD 在 stm32 芯片中加载固件和调试。它使用 3 个引脚:SWCLK(TCK)SWDIO(TMS)GND

我可以使用其他未在 SWD 接口中使用的 JTAG 引脚:( TDI, TDO, TRST) 用于自己的目的,同时保留在芯片中刷新固件的可能性吗?

stm32 jtag cortex-m

2
推荐指数
1
解决办法
2868
查看次数

arm-none-eabi全局初始化变量不正确的值

我试着为stm32f334做一些例子(只是led闪烁).当我想使用.data部分约束时(通过使用初始化的全局变量),我遇到了链接器的问题我遇到了问题.全局变量的值不正确!

这是我的代码:

startup.s:

    .global _start
    .thumb_func
    _start:
    .word 0x20003000
    .word reset
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang

    .thumb_func
    reset:
        bl main
        b hang
    .thumb_func
    hang:   b .
Run Code Online (Sandbox Code Playgroud)

blink.c:

    #define RCCBASE 0x40021000
    #define GPIOBBASE 0x48000400

    static int wymuszenie_bss;
    int wymuszenie_data = GPIOBBASE;

    int main ( void )
    {
        unsigned int* ptr;

        wymuszenie_bss = 0x40021000;

        ptr = (unsigned …
Run Code Online (Sandbox Code Playgroud)

arm bare-metal stm32 linker-scripts gnu-arm

1
推荐指数
1
解决办法
77
查看次数