РЕДАКТИРОВАТЬ: вставлен неправильный код
Я нахожусь на Beaglebone Black под управлением Linux SDK TI, я верю 4.14.
Я думаю, что это довольно общий вопрос.вы, вероятно, можете перейти к следующему абзацу, но если вас волнует вот эта особенность: я пытаюсь отслеживать значение регистра TBCNT в EPWMSS2.Это счетчик.В соответствии с тем, как он настроен, при включении ШИМ счетчик увеличивается от 0 до некоторого числа, скажем, 32000, а затем снова начинается с 0. Я хочу сохранить текущее значение счетчика, которое я прочитал, а затем сравнить со следующим значением Iпрочитайте и проверьте, обнулился ли счетчик на 0. curr < last
определяет:
#define PWM2_OFFSET 0x48302000
#define PWM_SIZE 0x1000
#define TBCNT 0x8
I 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 и регистры и действительно C в целом.Я уверен, что я злоупотребляю mmap()
в некотором роде.Я ожидаю, что munmap()
освобождает память, используемую *pwm_mmap
, поэтому я не понимаю, почему у меня возникают проблемы с выделением памяти.Мне нужно malloc()
pwm_map
?
спасибо, ребята.