OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4967|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( O/ D' f2 k2 u1 `& t0 W9 _( ?& L7 s. b
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! Z" F! h6 J/ B$ s3 ~1 g# }, t#include <unistd.h>
5 ?4 L- Z0 B# R% O#include <sys/mman.h>' G/ c, g! u, h7 s6 q
#include <sys/types.h>
% q! _/ A+ ^  d: |6 y#include <fcntl.h>
9 }1 P. a0 p7 c+ z% W( m$ n! B8 I6 N! ?/ b
#define SHAER_RAM_BASE_ADDR    (0x80000000)   $ G% p8 o) Q  n+ X3 F

0 A: |0 Y* n/ @7 L' Ltypedef struct
0 r! S# w. v% g4 K' P! q+ V) P& h! m0 ~{' w' W' w4 p: K! b2 B0 H$ A
        unsigned int a;8 x0 Z/ p# ^: f/ f, G; t6 Q
        unsigned int b;
. F+ C- [4 |8 H) r; A( ^# L        unsigned int packet_cout;0 y- s, c  {& ^# v  _. }+ g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 G1 X) B4 H- K& d) }
) t" Z: N6 ~7 j# E% w: {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);6 i) H1 p2 a- p5 D0 C) ^$ m
unsigned int count_copy = 0;
% N- t1 {# x4 s% M
7 j9 }( S% a7 L* {. J, w6 z
4 V% k0 D) q' }! vint main()
$ ?) S+ F3 l  [$ N{2 c7 T: d9 N/ K, m. j3 ^
        pRX_MSG_PROTOCOL pshreRAM = NULL;
* @: x4 O, U% F$ p5 g        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% t3 x% z& B7 |0 d" p8 ^+ G9 a  u% M  `0 z8 I6 B
        while(1)/ U, W) s/ U5 o- [0 n( S
        {
% o, T% `4 f+ Z0 y& _                read_MSG_buffer(pshreRAM);  a: e2 c/ u4 T) p
        }                ) q9 C  }! Q/ {; e- n
}
8 a% \5 C/ b* e, f) `  c  Z* U7 e2 C/ J! L; q5 {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 F/ O. e0 c3 L! O- @{
- M( V6 m& C  W6 U9 f  o+ d        RX_MSG_PROTOCOL buf;
. b. w/ @, i% g/ u* A) ~        
+ d% O7 `/ n# G4 e, g: D% @4 ^        buf.a = pshreRAM->a;) n# e) k" w6 |! r3 |  {6 F2 V7 ^$ R7 ^
        buf.b = pshreRAM->b;
' v8 r' n: D- V4 S        buf.packet_cout = pshreRAM->packet_cout;+ h1 s6 V/ r* o7 {5 m4 T  M, t
        4 S. h. E( a; c  ]. {+ y' s4 O# N5 k
        if(buf.packet_cout != count_copy): V/ ?& |8 l# X( p  {+ h
        {
0 m/ g( c: n; T5 O. d6 {! L+ ?, t4 l                printf("a is %d\n", buf.a);% @9 X0 U' U0 t8 _. R* x8 \1 Z
                printf("b is %d\n", buf.b);
  s% _0 I# h9 u; X1 }* Z                printf("count is %d\n", buf.packet_cout);
. q9 W2 x3 J; p- w& K. _                count_copy = buf.packet_cout;
& _& e* D8 g( z+ I* g4 i        }1 D! ~) w* X3 }/ `9 Y) H$ l7 \+ `
        else8 x- a+ c4 @) g+ [- u
        {4 \2 a" v! i7 @8 g
                printf("No effective message!");+ U# d8 S7 A5 `6 a8 J1 G
        }" ~+ s$ l0 W+ _6 D
}9 _* k5 |' a$ e$ t6 i

; [# X; e* U0 n% U" m+ Z* G9 k/ `. U, [- m& Q; U5 ^) x
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; q* d7 X4 W" i0 i7 I3 z
使用下面代码,对内存使用了mmap函数后:# Y) [" m+ B- I$ K; Y; [
#include <stdio.h>
4 n, X" f) O- E# @5 g; |#include <unistd.h>
1 }6 N) S/ _8 M% ]; I#include <sys/mman.h>, k6 [: R: i/ N2 |, \7 J
#include <sys/types.h>+ m/ g2 c4 v# D
#include <fcntl.h>% @/ V. J0 d8 F$ C, k$ f/ T/ P
% a% h/ w+ u: m- l% q/ i' g$ y0 F4 s
#define SHAER_RAM_BASE_ADDR    (0x80000000)4 o$ ?$ u2 y# y) ~$ K6 [  j: o! ]
#define SHAER_RAM_SIZE         (0x20000)   
7 V4 u- P: u$ L( L% h
; Y* j& M1 R: y; [$ X! Mtypedef struct
4 T" c! e5 o+ f1 }. d5 J6 j; w{9 c# @& c2 \. m7 @
        unsigned int a;
! d) Q& X6 G1 J5 n- O$ E        unsigned int b;
% ~1 m( k2 x7 g  |9 B! T; Y        unsigned int packet_cout;& f  n( p4 m; n7 O
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ {9 l+ v0 ?( q- s% u5 L& O) r+ c$ P$ |; i, z
void read_MSG_buffer(int *baseaddr);8 r/ M; H) _7 |4 G7 p# v8 r
unsigned int count_copy = 0;
7 d5 F( ^9 ^9 [! V) }2 t8 t4 s: w" J, W" M/ D6 v
int main()
) F" s$ i# W9 U, j{7 l# C$ ~( m6 s1 R8 q% o9 B
        int fd;: v9 \0 f3 _0 G3 e: K8 j' n* @
        int *mem = NULL;. R  _! r0 z& g- q

/ B* D" Q3 y& ~3 V& b6 W3 f; i        if((fd = open("/dev/mem", O_RDWR)) <0)
/ p0 s  l$ b6 Q& r7 L        {
6 G1 n9 J/ t0 W: a" P' H                perror("open error");
) p" ~8 e$ K; b5 W$ a: v                return -1;
2 D3 W0 B9 t, T& a        }$ P3 a; n! q& V. H8 c1 P- p8 h- ^1 K
        ' m! q; f5 S( X' s) {0 ~7 v# s
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);" }% o+ K' ]4 G  O1 x; c$ |0 ^
. t- z  P- q/ O1 a7 E0 {+ V& j
        while(1)( D' o% s5 X1 Y, s2 t
        {  R# m6 R5 C9 l  o, b- m5 E3 ]
                read_MSG_buffer(mem);' x7 @: u+ l) A# v
        }                + H- S% W& f7 Q9 A6 I# C
}
  U0 R4 ^/ F: h; f- T# ]4 ?$ F# v0 L& t; u% R8 g) @
void read_MSG_buffer(int *baseaddr)* G5 W( Z. ~- Y/ ~" A9 C
{6 `3 w. F: o- R
        pRX_MSG_PROTOCOL pshreRAM = NULL;# F5 L1 G) z* F

7 r6 U8 I" t( l- Y3 u1 I0 C        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 {: v3 ]& U: Q) W/ F
; }4 [3 j4 Q1 U0 ?* L# b9 k2 H
        if(pshreRAM->packet_cout != count_copy), d; `/ \' I2 r6 \, ]8 l8 w/ W
        {
5 Q- a8 ]6 o1 }; s' \                printf("a is %d\n", pshreRAM->a);
- V( u4 t5 X1 r7 w0 q  |                printf("b is %d\n", pshreRAM->b);
- w1 {4 u8 P* {7 d. P" Y* z                printf("count is %d\n", pshreRAM->packet_cout);
, R7 }6 K1 J: T6 m                count_copy = pshreRAM->packet_cout;' |2 L% [6 I& H. w
        }
  a. Q2 t3 r  @. w3 B  t/ n' U        else
1 ?) i9 t3 T, c( U- F  N9 V        {" r3 n5 U* a8 R
                printf("No effective message!\n");
7 S* ]; \4 S) d+ V1 b        }
+ Y. p) S/ W7 h8 O  f- e4 j}; S8 d/ |. b0 H4 A* o3 x$ m
) Y; o( A; r  v" e0 m  H7 T% u
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; @% u4 p# Z: X$ K/ N# {/ _4 B
- K& o! Q- J. P* I+ d

; l5 N# [1 Q2 ^% t, n) M$ j
& W5 o$ |% R1 I
# v' V+ ?/ ^' p2 d; y8 M. X+ [" T* F. H" B
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-9-19 01:07 , Processed in 0.037179 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表