OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) h4 h' B5 `# Q' c* ]+ |/ R/ y" G7 @: M2 a  ~4 f5 r9 N8 \
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ c" s* m5 n: V1 B' d1 |% P
#include <unistd.h>
4 ], S% n+ E) J: Z9 j#include <sys/mman.h>+ z1 Z3 }4 e0 [+ R- J; V9 P
#include <sys/types.h>% @3 h3 d, }0 _6 U0 @
#include <fcntl.h>; i% K) m* |/ ]4 }* a$ p. S* T

& u9 `" D( G5 R1 L# A#define SHAER_RAM_BASE_ADDR    (0x80000000)   5 Z8 O4 J# S3 Z9 K7 ?+ \

9 f$ N1 \# l. m# i( U- ]typedef struct
* i7 I1 j8 H4 f/ P! N& I: q- ~{
. {3 q. }% n. Q0 ]        unsigned int a;
7 Z. I0 \: u: H9 r4 U; X/ t7 ?        unsigned int b;4 P9 p& t) V2 v& l' h& K
        unsigned int packet_cout;
9 X4 Z6 H+ Q7 r5 d2 O7 a/ L2 b* w, P}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. z! G# G5 v; w0 p( A

: A2 S$ n% v: z: F3 ~8 H6 Kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
& W% I7 ~* a* q! X3 l- f2 V, i6 punsigned int count_copy = 0;
0 w+ Z. V1 U# w2 C+ F* P) v; X, o$ J+ ?$ |  |

6 ^: u# T. Y7 s; R: s8 h$ Lint main()
. b( \8 ~0 `8 \& u{
9 F0 }2 s) T( Q0 m/ M        pRX_MSG_PROTOCOL pshreRAM = NULL;  E$ L# w+ P8 `* r4 k, S  v$ ], M
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;, x4 r# ]! m! a% r- Z6 X

/ Z0 Y" v( \) Y1 o7 V+ @        while(1)
( [* c! y9 g  F0 |3 f        {- h& @$ t: _; i
                read_MSG_buffer(pshreRAM);
% a1 b% E; [0 H  u        }                & W/ v* b; Z% n2 ?0 l
}
3 p/ T, A7 x3 D( _0 a; B  u7 \& F0 t, v3 W, n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 |* f) q; W- A" a
{3 [9 k" H* h( a5 k( l
        RX_MSG_PROTOCOL buf;
! g: \( F  b- |        
( ~3 Y9 ^" ]' f; k3 I* ]# V. l# O        buf.a = pshreRAM->a;
  Q6 M( z, T9 G6 p1 Q; v: R        buf.b = pshreRAM->b;
% Z! @5 b( q& T) l1 ?/ q' X        buf.packet_cout = pshreRAM->packet_cout;
" `! O: c$ m% K7 O8 t        % ]$ d: v- e2 H4 @1 I+ R+ {
        if(buf.packet_cout != count_copy)
; z1 A% c% L# E( d9 m; V$ g        {
3 L3 w* w4 w* `- o, b                printf("a is %d\n", buf.a);& Y6 k6 ]2 [( L7 d
                printf("b is %d\n", buf.b);5 L* z: F0 \! Z4 }9 g
                printf("count is %d\n", buf.packet_cout);, R0 I6 C3 i7 }# H, C$ T7 r
                count_copy = buf.packet_cout;
' h  l2 ~4 u) V4 q0 g% t/ J        }* |1 Q' e+ W- O+ V& O
        else
  _& v' t- ~" F; N' m- R; I        {
5 Z0 X. X7 M3 m0 l. u1 H                printf("No effective message!");! u- c  F6 n: T/ y
        }/ v0 i4 r" P( }8 g& a( ]
}
% |* Y% b" w/ V2 A5 _$ X' ?4 N) L( C  p
% `9 U, g7 q- A% L
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" D, m/ w  j9 S
使用下面代码,对内存使用了mmap函数后:9 b: L7 [6 e5 G
#include <stdio.h>
$ N- }4 ?/ L. [( d  v, g#include <unistd.h>0 s5 t! o5 s$ t7 i  F8 `
#include <sys/mman.h>7 N2 C1 J8 d  v: `
#include <sys/types.h>0 W7 r# h$ k5 [2 m, `  l
#include <fcntl.h>' h/ P$ J* u8 R4 Y# b

0 n0 D7 R8 u; o: j2 @2 M. ?9 h#define SHAER_RAM_BASE_ADDR    (0x80000000)
7 j8 G0 N) L+ }) e#define SHAER_RAM_SIZE         (0x20000)   ' _1 Y) b1 \9 L$ d; w4 m- E5 @
! l1 ]7 w; l* `( d: v. o- X
typedef struct% S$ E, e& E1 Y
{* t1 g. J0 H2 I
        unsigned int a;  Y! t' q" q: q+ J( ~
        unsigned int b;$ S$ {! y% K& `9 m5 I
        unsigned int packet_cout;' \) f( o, d# M6 u' o' \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  J0 R: \. s6 [0 `4 K% T

& d& {3 s+ Y# Z3 c4 Ovoid read_MSG_buffer(int *baseaddr);' a# Z! X' X2 @8 e2 W
unsigned int count_copy = 0;6 B+ A/ E# M3 p! G: V3 Y% A
) n- n) N9 A; i
int main()' F2 N9 U; e8 f% B% H
{
7 X/ a: _- z4 U7 y* u; o        int fd;
& `2 M1 k, c+ q  B+ |1 K0 u( }        int *mem = NULL;/ [) |, a  t7 K, A% X
5 c0 K9 B5 g8 t$ A* M6 a
        if((fd = open("/dev/mem", O_RDWR)) <0)* H) b3 x* f. y  ?8 G/ K
        {
  ~* R/ H5 n' t3 [5 K, v                perror("open error");
4 p/ C$ k+ G. ^+ Q+ d, L) T                return -1;7 N# |0 q" N# e
        }
( f0 w0 b( ?2 N+ ?( a# e        1 `0 `9 f% y2 t  J6 s
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);/ p# a4 ^) |( S: M

9 \4 C! K% \  Q, T2 m( [        while(1): w- D' S* l. t- G: Y
        {/ V$ {2 M% n) p2 `8 R
                read_MSG_buffer(mem);
$ h. j$ F, T. O        }               
8 F* R1 n1 g. u1 z8 u; Y1 E- l}9 D8 @4 Z( Q. R+ E  n, Y& O* t( s

' U6 [# X' w. zvoid read_MSG_buffer(int *baseaddr)
. I7 k7 _# |0 V6 x{
# E" D3 P; C8 v, V) Q3 K        pRX_MSG_PROTOCOL pshreRAM = NULL;
8 _" z9 m+ U! E/ n  l( v
! j0 t! F3 O' q, v4 U        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;  S2 q; E' {- O

2 _) ^+ e0 F8 u; k        if(pshreRAM->packet_cout != count_copy)
% i* U( j6 {( P- \2 _+ d& \7 z        {3 J& M$ F- W) g# H
                printf("a is %d\n", pshreRAM->a);
6 u  i2 L& L, z* e6 T                printf("b is %d\n", pshreRAM->b);, S& C3 Q8 ?. h/ B7 ]7 [
                printf("count is %d\n", pshreRAM->packet_cout);
- h' u( A. a% ?                count_copy = pshreRAM->packet_cout;, p- \* I9 F0 Y, d4 W
        }+ j: L  L% n, X
        else
, f7 z/ t+ O9 m% ^( x        {
2 j2 z1 P; z! o                printf("No effective message!\n");
% ~" n" \3 ?6 S9 r, M" U9 b        }
) l1 w9 i1 Y! a1 x}
' Q- W# s8 W& Y# ]3 [& e! f) o5 r/ I% j
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???7 B3 f  S  n. f  f5 B

4 L- c2 W6 q8 G2 M
  Y6 U  }+ X* t' c! U: P$ z) |) [6 u5 j/ i9 t' g

. f7 P! @$ s: d
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-3-1 07:57 , Processed in 0.041741 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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