小编ber*_*ing的帖子

fwrite是否刷新'\n'上的缓冲区?

我有自己的执行_open(),_close(),_write(),_read().

我的代码:

FILE *f = fopen("0:test", "wb");  // calls _open()
fwrite("hello ", 6, 1, f);
fwrite("world\r\n\0", 8, 1, f); // calls _write(3, "hello world\r\n", 13)
fflush(f);                      // calls _write(3, "\0", 1)
fclose(f);                      // calls _close(3)
Run Code Online (Sandbox Code Playgroud)

BUFSIZE 是1024

编译器:arm-none-eabi-gcc/版本:5.4.1

即使我有旗帜,为什么要fwrite()解释?'\n'"wb"

是否fopen()解释文件名"0:test"

c stdio stm32 newlib

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

更改运行中断处理程序的优先级?

我试图在cortex-m3控制器上实现以下伪代码,(特别是STM32L151)

void SysTick_Handler() {
    do_high_priority_periodic_tasks(); // not to be interrupted
    lower_interrupt_priority();
    do_low_priority_periodic_tasks();  // these may be interrupted
}
Run Code Online (Sandbox Code Playgroud)

换句话说,运行优先级为0的第一部分,然后以某种方式将当前中断优先级降低到15,以便其余部分可以被其他硬件中断抢占.

一个想法是do_low_priority_periodic_tasks();进入一个单独的中断处理程序,并调用此处理程序,通过该处理程序NVIC_SetPendingIRQ()设置NVIC->ISPR[]寄存器中的挂起位.这样,其他中断将紧随其后SysTick,除非有任何优先级在0和14之间的待处理.

#define LOWPRIO_IRQn 55
void IRQ55_Handler() {
    do_low_priority_periodic_tasks();  // these may be interrupted
}

void SysTick_Handler() {
    do_high_priority_periodic_tasks(); // not to be interrupted
    NVIC_SetPendingIRQ(LOWPRIO_IRQ);
}

void main() {
    HAL_Init();
    HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
    HAL_NVIC_SetPriority(LOWPRIO_IRQn, 15, 0);
    HAL_NVIC_EnableIRQ(LOWPRIO_IRQn);
    while(1) {
        /* main loop */
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经选择了IRQ 55因为它没有占用我的控制器,它将是STM32L162上的AES中断处理程序,但我有点担心.我应该选择不同的IRQ,也许是未使用的DMA通道中断?使用Cortex-M3内核定义的中断57-67是否安全,而STM32L系列中没有?有没有更好的方法呢?

embedded arm cortex-m3 stm32

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

在cortex-m3上读取一个64位的volatile变量

我有一个32位的Cortex-M3 ARM控制器(STM32L1),其可以通过异步中断处理程序来修改在64位整数的变量。

volatile uint64_t v;
void some_interrupt_handler() {
    v = v + something;
}
Run Code Online (Sandbox Code Playgroud)

显然,我需要一种访问方式,以防止获取不一致的中途更新值。

这是第一次尝试

static inline uint64_t read_volatile_uint64(volatile uint64_t *x) {
    uint64_t y;
    __disable_irq();
    y = *x;
    __enable_irq();
    return y;
}
Run Code Online (Sandbox Code Playgroud)

该CMSIS内联函数__disable_irq(),并__enable_irq()有一个不幸的副作用,迫使编译器内存屏障,所以我试图拿出一些更精致

static inline uint64_t read_volatile_uint64(volatile uint64_t *x) {
    uint64_t y;
    asm (   "cpsid i\n"
            "ldrd %[value], %[addr]\n"
            "cpsie i\n"
            : [value]"=r"(y) : [addr]"m"(*x));
    return y;
}
Run Code Online (Sandbox Code Playgroud)

它仍然禁用中断,这是不希望的,因此我想知道是否有一种方法可以不诉诸cpsid。该权威指南的ARM Cortex-M3和Cortex-M4处理器,第三版由约瑟夫·耀

如果在处理器执行多周期指令(例如整数除法)时中断请求到达,则该中断处理程序完成后,该指令可能会被放弃并重新启动。这种行为也适用于装载双字(LDRD)和存储双字(STRD)指令。

这是否意味着我只要写一下就可以了?

static inline uint64_t read_volatile_uint64(volatile uint64_t *x) {
    uint64_t y; …
Run Code Online (Sandbox Code Playgroud)

arm atomic interrupt cortex-m3 stm32

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

一个父进程的多个子进程

我正在使用fork实现一个简单的父/子进程程序.我的目标是从单个父级创建用户输入数量的子进程,并将其PID存储在动态数组中.我设法使用fork创建子进程(我认为)并存储他们的PIDS.但是,当我存储PID时,我还存储了0 PID以及我认为与进程相关的另一个PID,但这个数字比子进程和父进程大得多.

为什么如果只在父进程内完成这种情况呢?

void createProcesses(int nProcess) {
  int i;
  int PID;
  processIDS = calloc(nProcess, sizeof(long));

  printf("*****Creating Processes*****\n");

  printf("Parent Process: PID %d\n", getpid());
  for (i = 0; i < nProcess; i++) {
    PID = fork();
    if (PID == 0) {
      printf("Child Process: PID %d\n", getpid());
      while(1){}
    }
    else if(PID != 0) {
      // sleep(3);
      // printf("Number of child processes created: %d\n", nProcess);
      // updateProcessList();
      *(processIDS + i) = PID;
      printf("%d\n", PID);
    }
  }
  for(i = 0; i < sizeof(processIDS); i++) { …
Run Code Online (Sandbox Code Playgroud)

c linux fork process

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

标签 统计

stm32 ×3

arm ×2

c ×2

cortex-m3 ×2

atomic ×1

embedded ×1

fork ×1

interrupt ×1

linux ×1

newlib ×1

process ×1

stdio ×1