【发布时间】:2019-08-01 01:49:58
【问题描述】:
编辑:粘贴错误代码
我在 Beaglebone Black 上运行 TI 的 SDK linux,我相信是 4.14。
我认为这是一个非常笼统的问题。您可能可以跳到下一段,但如果您关心这里的细节:
我正在尝试监控 EPWMSS2 的 TBCNT 寄存器值。这是一个计数器。使用它的配置方式,当启用 PWM 时,计数器从 0 递增到某个数字,比如 32000,然后从 0 重新开始。我想存储我读取的当前计数器值,然后与下一个值比较 I读取并检查计数器是否已重置为 0。curr < last
定义:
#define PWM2_OFFSET 0x48302000
#define PWM_SIZE 0x1000
#define TBCNT 0x8
我 mmap() 我需要的寄存器,然后每 100 微秒打印一次寄存器值。打印的值不会更新,总是一样的:
int main(){
volatile unsigned int *pwm_mmap;
int16_t *count;
int fd;
int i;
fd = open("/dev/mem", O_RDWR);
if (fd < 0){
fprintf(stderr, "open: %s\n", strerror(errno));
}
pwm_mmap = mmap(0, PWM_SIZE, PROT_READ, MAP_SHARED, fd, PWM2_OFFSET);
if(pwm_mmap == MAP_FAILED) {
fprintf(stderr, "mmap: %s\n", strerror(errno));
}
for(i=0;i<10;i++){
*count = (void *)(pwm_mmap + TBCNT);
printf("count = %d\n", *count);
usleep(100);
}
if (munmap((void *)pwm_mmap, PWM_SIZE) < 0){
fprintf(stderr, "munmap: %s\n", strerror(errno));
}
}
所以我每次打印值时都尝试munmap() 和重新mmap()。这行得通,我第二次映射时得到了一个新值。但我只能这样做两次,然后我得到mmap: cannot allocate memory:
int main(){
volatile unsigned int *pwm_mmap;
int16_t *count;
int fd;
int i;
fd = open("/dev/mem", O_RDWR);
if (fd < 0){
fprintf(stderr, "open: %s\n", strerror(errno));
}
for(i=0;i<10;i++){
pwm_mmap = mmap(0, PWM_SIZE, PROT_READ, MAP_SHARED, fd, PWM2_OFFSET);
if(pwm_mmap == MAP_FAILED) {
fprintf(stderr, "mmap: %s\n", strerror(errno));
}
*count = (void *)(pwm_mmap + TBCNT);
printf("count = %d\n", *count);
if (munmap((void *)pwm_mmap, PWM_SIZE) < 0){
fprintf(stderr, "munmap: %s\n", strerror(errno));
}
usleep(100);
}
}
我做错了什么?我是 mmap 和 registers 的新手,通常是 C 语言。我确定我在某种程度上滥用了mmap()。我希望munmap() 释放*pwm_mmap 使用的内存,所以我不知道为什么会出现内存分配问题。我需要malloc()pwm_map吗?
谢谢大家。
【问题讨论】:
-
您调用
mmap两次并交换大小和偏移值???这是复制粘贴错误吗? -
另外,
*count = (void *)(pwm_mmap + TBCNT);看起来是错误的,因为您通过尚未初始化的指针count将指针存储在 int 中。我想也许你的意思是count = (int16_t *)(pwm_mmap + TBCNT); -
是的,这是一个错误.. 感谢您指出这一点。我现在看到计数的分配不正确。非常感谢。这就是我一直在寻找的。span>
标签: linux mmap cpu-registers beagleboneblack