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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % ]/ H2 r- }  p6 O* E6 K

. S' ?. M0 e& |( K0 q  x6 L0 gOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ Z4 d' R* |/ q* z& z) {5 E
#include <unistd.h>
4 ^: r3 n5 @; i3 B! o6 r- X. J6 ^3 M# \#include <sys/mman.h>4 r4 A- ]( ~( A4 r5 ?) M% C: e
#include <sys/types.h>
" r7 a# c, O8 [4 h5 i. S' V( P& ]6 q#include <fcntl.h>
; I; `! J7 u; R' q! t+ ?& N+ k- l" q9 A2 q8 [& C4 j  `
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
, W; ^: f7 t6 q1 r. W6 P% y' q+ C  K" `
typedef struct
; }) v4 u0 \' a) p5 X! S# V. d{5 I" `' Y2 T* }) n( k  a, X5 ?  Q; x
        unsigned int a;
% e' F' x: a+ u# I3 u3 N: j        unsigned int b;8 @1 _; ?- }+ l: D' V
        unsigned int packet_cout;
, P* p- {6 N1 X1 i: u}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' o* o6 K7 a' P! a6 J. }* k6 o
" s& Y: s& u% A5 T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);# t" c3 m- [) n5 \+ J
unsigned int count_copy = 0;
0 v. s, H' [& X; g$ x, i0 g( s3 z
' ~, \: h# B# B* l8 r  L  c& v6 W0 U7 Q/ V+ [
int main()
" z- ~( v- j. b/ e5 U6 R/ S{9 N  m, q; a4 O* U
        pRX_MSG_PROTOCOL pshreRAM = NULL;3 Z5 C. ]2 `2 x% b/ [0 b( J9 m: H0 M6 W
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 T7 T  @( d- I" ]  c4 X

$ n0 y6 f( z& ~/ ^+ y        while(1)
" B; w* @4 e( p4 F+ s- R' ~        {
, c/ a$ {5 O& |0 X& W                read_MSG_buffer(pshreRAM);1 {: @( p8 g9 {
        }                " @  g4 D( I& M6 t
}% l% c+ k# y! \

" k( z; n4 r: F. `0 ]' Wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 p/ ^0 @, m/ v7 c) d4 Y, h
{
1 q; S* m2 |6 j3 @        RX_MSG_PROTOCOL buf;' _/ g6 n0 a0 N2 D& T
        
/ M, s0 \& L3 Y4 O: |        buf.a = pshreRAM->a;1 `; o2 j9 z$ \7 O* @+ B
        buf.b = pshreRAM->b;# ]3 f2 C6 F3 X3 V
        buf.packet_cout = pshreRAM->packet_cout;
3 ^- a* @2 C9 F( D9 ^        
* P  U; \/ f4 x        if(buf.packet_cout != count_copy)+ m, G. k3 y2 I1 z5 ?
        {- z- _. y% i& O" k  M1 \; i3 D: t
                printf("a is %d\n", buf.a);  ?7 P- k# J: l' m9 C
                printf("b is %d\n", buf.b);
' ~$ R! \3 m: \' ^% ^                printf("count is %d\n", buf.packet_cout);8 `2 d! T, n  v. f
                count_copy = buf.packet_cout;- `" P# O  W. |( Z- o
        }4 [" Z0 x+ m2 I9 e
        else9 u! x( T" R- \+ S; `
        {. ^, t( G7 P! y% ~0 O' H' ?
                printf("No effective message!");5 u  H+ Y+ F- S. C$ ~  n5 q
        }
. d+ t% c0 D0 h% f/ O}4 l6 R0 X8 P4 a( _3 ~8 {) F' \( b
$ C: C6 y- Z5 F4 |" Y+ X; B
* q7 O" o+ U) T# ~- B9 Y8 G& [  v& }
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 G: V  n- p$ K: k- i
使用下面代码,对内存使用了mmap函数后:& b8 a, Y7 {# W) [  o- Q
#include <stdio.h>
- O3 {. O4 e* L; ~* D/ D#include <unistd.h>& \; S% z5 Y+ h: H# N- s) B
#include <sys/mman.h>
2 n+ f: m5 h# Y" E2 T#include <sys/types.h>
% L# o0 R( {" y. z0 x  X, s#include <fcntl.h>+ j* [/ \; N- f

2 S; y% a" I4 N#define SHAER_RAM_BASE_ADDR    (0x80000000)$ ~8 L, o% f) V/ b$ ?; X
#define SHAER_RAM_SIZE         (0x20000)   
/ R2 k$ V4 d: H5 T6 H5 E; e, w5 Z# K& W1 u& c& L
typedef struct
! d1 Z- o) c: H% w0 H{: J2 G" Z/ @5 y; @+ u, M4 [
        unsigned int a;
: S$ D4 u0 g5 A- C5 u% {        unsigned int b;
& ~! d, z; B9 z# ?        unsigned int packet_cout;& {2 l1 `! L% ^, i) f9 F  Z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" w0 u( n$ W) l; |

' M" Y, R; y. Y7 |* Ivoid read_MSG_buffer(int *baseaddr);
) O1 R" m7 b. i8 Z0 n: T& munsigned int count_copy = 0;
8 J" W/ O1 ]/ [8 s
$ g( T6 T3 q1 u# B$ Nint main()
9 s" z: `$ p1 h4 r3 I8 r5 z{
3 p. A% J& j* _9 r) B. b        int fd;/ Z4 g5 \6 z, x7 X8 O. b0 ]6 [; i
        int *mem = NULL;0 l" U' p: Y% {3 _" ?
! B) e! {* [- b  G
        if((fd = open("/dev/mem", O_RDWR)) <0)) t# i" [" |* H/ `
        {
) a3 p: p$ k5 f  d; E3 ?1 c; J  J1 P                perror("open error");
0 u; o' ?" c* H: m9 m. |2 h6 C3 {                return -1;
% b! o, \; I- u$ y/ C, u; l3 ~+ b        }: S5 }0 ]0 ]7 l5 f) I
        
/ H1 [% u; u) F, d        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" X! j# i+ T2 s6 A
1 |( m! U7 F0 \% `  G: l2 |        while(1)7 [. A, r+ @; k- r1 a" F; e
        {
" B2 ?; R# O" t/ u7 o5 ?6 J                read_MSG_buffer(mem);
2 b, o3 W2 t4 [3 Z        }               
) i0 Q* r" j* U9 `}$ f; j+ x4 E8 n, x
. f3 M: l1 f- W, B
void read_MSG_buffer(int *baseaddr)
- \- z1 |$ l% p; p{
! B3 Q  s6 U% N: O        pRX_MSG_PROTOCOL pshreRAM = NULL;
, G" K! Q4 X5 l: z* T
1 a  ?& T. l! J. E        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;0 L% E' y& m6 q: d% V: J! c

6 q! ~# R# [3 q% ~        if(pshreRAM->packet_cout != count_copy)
  h9 x" A' G4 F( F& @7 a        {
. [3 }& b* V  h) Z5 Q                printf("a is %d\n", pshreRAM->a);
. [; }: ^% O; P; B+ |0 d* @8 @                printf("b is %d\n", pshreRAM->b);4 ]1 b8 v8 N! W6 q# y! n
                printf("count is %d\n", pshreRAM->packet_cout);
, |: S# Y, S$ c* D" M                count_copy = pshreRAM->packet_cout;
, i9 @" y( e. Y7 ?( ~( s        }3 ]* n7 }$ W- {$ y3 U. b7 I
        else
( _0 t; x$ `" r2 j# V        {
, p' e- R+ K" B5 H9 H' K2 \                printf("No effective message!\n");
* R! g3 W5 h/ I: i4 B        }* E9 m; d7 s/ y
}
" _' L  F- s3 A/ c! f( S5 b; X( z6 `4 n
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* }. o* V0 x. C$ ~

) B6 C5 E. R7 r" [: D- J! I& e# ^7 `- K

  e: m: f7 m# Y1 S1 N, K/ c, o/ I/ X
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-6 19:30 , Processed in 0.038967 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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