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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 l# ^  I. Z- d6 N5 t& r

( q) I; P1 [; ~! T; Q! AOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 T" a" p+ T# A" W. c" ~4 h
#include <unistd.h>
2 u" D' E$ b' O& x& r6 v#include <sys/mman.h>
: m1 [& ^7 ]# J& K) ]: Y#include <sys/types.h>
! y# X6 T# J2 Z/ m#include <fcntl.h>
1 ?5 p4 z) p) ], Z8 \* Z4 I5 r5 h/ ?5 i1 {0 [
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
. {9 l! g4 K0 U6 i* j; ?1 W% V( K7 |. P9 E' h; ?1 X2 m
typedef struct
- R; o2 D2 |3 C2 P, `& U. ?* R{8 ]! b4 o% Z6 S: j
        unsigned int a;% r9 Q& A! X5 A; M, A2 t" _0 v% S) N
        unsigned int b;
, @+ B3 T$ W9 K# D( m/ y* e        unsigned int packet_cout;
. s% J! f3 y1 P}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 l* o& t. L4 m+ f
) W5 e& R/ L3 `( q* V  N  _void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
& E; x/ y8 f# R! U- j8 I, y& lunsigned int count_copy = 0;9 z% k  f3 I4 b' R5 H) X) \
4 q: d1 {1 ~0 F) n9 B
- o2 c. @; l( a* w+ V
int main(); G* S: M& f; {
{  A- ]* W+ r) m& V1 E& W
        pRX_MSG_PROTOCOL pshreRAM = NULL;9 l7 G  P  M6 l0 z( e' g
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;2 \* q! S( a& v+ r! p

" F9 S( ?! y- @2 k+ c1 G* D        while(1)7 M, q3 R" B# Q, R# I
        {
; f5 `, M) r, y7 F                read_MSG_buffer(pshreRAM);
. v) I- @. [* U( \        }               
7 k  {* c6 [" e! o}, ^4 ?: r; c( `
5 a) v7 X' N# z  E9 V2 L. \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)1 t9 q4 G% @. u: r
{! Z$ i+ w2 C2 r  q! U) L# d
        RX_MSG_PROTOCOL buf;6 c2 M8 L, V1 Q4 I
        
5 a- e9 j. U* Y8 h  w        buf.a = pshreRAM->a;1 n( I7 d* g1 U0 l2 k
        buf.b = pshreRAM->b;
# H! l/ I: G- C7 C3 F* F4 g! N3 }        buf.packet_cout = pshreRAM->packet_cout;6 E7 O* E$ Q; x" a
        
4 s# i. L6 Q* h        if(buf.packet_cout != count_copy)# m3 f8 ~9 T: ]6 P  L
        {+ }& j# T; s1 y4 p' b9 p5 \
                printf("a is %d\n", buf.a);- j6 _% P2 r9 D; U- \# l. ~
                printf("b is %d\n", buf.b);
/ _+ O8 U; H4 ^2 _* q% M                printf("count is %d\n", buf.packet_cout);
+ D4 s+ K3 B0 M                count_copy = buf.packet_cout;, S0 O% X. ~$ }9 O
        }$ i9 ?0 w  {# e
        else
8 D7 [$ z( I( ~9 ]4 X; y        {
' Q; }! s. }% @3 e. `0 ^                printf("No effective message!");
, D8 X1 S8 i7 ?$ F0 @5 E* ?        }9 J0 y4 a+ a; |4 j! L1 p
}
) `6 |" \/ G. Z' L# A3 P. `- i6 o& C9 i
, Q. y, o. b/ l2 o- q- b
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 ?3 E2 o2 T. S  U5 T( b4 ^使用下面代码,对内存使用了mmap函数后:" D% L" r4 V9 y, w5 B( W5 l
#include <stdio.h>
' E8 N7 r( ]2 d, i#include <unistd.h>
) e  C; m: Q6 k( H#include <sys/mman.h>
. W8 }6 p/ F# ^1 G/ J" E7 a#include <sys/types.h>
4 U8 H3 Q9 T$ i9 J0 d#include <fcntl.h>
! |. X' k: G6 f# G; q. ]- [7 H: q4 E, @, o9 g) i7 n8 j# Y# \" c5 {; j
#define SHAER_RAM_BASE_ADDR    (0x80000000)) v5 E# f) j( G
#define SHAER_RAM_SIZE         (0x20000)   4 D' e% c* @" a" L! L
1 L! i* d& x% g
typedef struct
) z6 y% m4 V& y% u3 X3 d{$ G6 M) H# A( n: ^5 h0 i0 @9 E2 m
        unsigned int a;
; L$ l6 `  x4 F$ M        unsigned int b;; D2 v. W4 ?' M7 l
        unsigned int packet_cout;
4 o1 m" I3 n# @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 W9 P! Y" E1 z$ |+ g  |

3 W1 `) b! H; svoid read_MSG_buffer(int *baseaddr);
# M$ A# y9 d- r1 y& ^unsigned int count_copy = 0;0 [" \  k! C; l

4 J4 D: U' n! z9 m, f4 q3 Xint main()
3 X% j  Y% R$ C  f( T" v+ w2 u{
, p, T3 H* V( s+ m, ?$ J        int fd;8 P9 {* U5 R6 Z" m+ @' _' @7 ^
        int *mem = NULL;7 h4 m. ]7 I( D" e# J  C* e& H
1 j; h2 E$ s" Z; H
        if((fd = open("/dev/mem", O_RDWR)) <0)
6 K$ l% P. v& a! m8 k7 r8 N        {
0 d1 v. q& y, b) u! o( L                perror("open error");4 D$ A, z2 Y' Q/ ], @
                return -1;
" \, ^: _! E+ C        }
; k5 c; G9 A$ X+ \5 _) l: n        ) Z* K& o! n& ~9 A8 u( L/ A
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 C  X2 P3 o# u6 P6 ?1 ?7 z3 g
5 p3 d( J1 Q4 ?. v( l        while(1). }, C1 C" N6 x
        {
( ~9 Z1 {+ F, U9 B/ `, [3 ~. Q& u                read_MSG_buffer(mem);% B5 z7 Q7 @: Q  D7 m
        }               
7 X" Y  d3 w7 Z; ?8 {" `}
% ^% \7 r& ~5 Y. d$ t4 [' s1 x& o5 j& I3 H/ L9 I) y8 s
void read_MSG_buffer(int *baseaddr)
' W4 b4 O* v( A5 @/ g; g$ g3 A{2 Z* F4 v% P1 w2 a8 V% M
        pRX_MSG_PROTOCOL pshreRAM = NULL;
: G" \5 c0 G4 y  [& K3 p
4 u7 S, Q" A* X; {8 `        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" T; E/ K7 Q6 Q& u! T4 m
" a. c1 E9 h6 v" |0 S1 @! M        if(pshreRAM->packet_cout != count_copy)
2 Q& ]0 }# N- s  |! Q, Z/ @2 R        {" |' T+ `- K. }7 H$ Y5 @
                printf("a is %d\n", pshreRAM->a);
* w. X1 `* ^+ l: Z( j                printf("b is %d\n", pshreRAM->b);8 h- l* \; o7 W- ^4 u5 G6 B& t
                printf("count is %d\n", pshreRAM->packet_cout);6 m$ k& Y4 Z4 p1 \' N' P
                count_copy = pshreRAM->packet_cout;
, o( V9 G% Y* }  F        }, f  I- I8 Z, F$ r
        else/ Y2 `5 U" v5 K: @9 n
        {
" ^5 V9 s( |$ g7 x, t" s+ |- a0 d                printf("No effective message!\n");0 P! }8 N( i* L4 L$ b
        }
, B( L8 m* Y- ?}
- I- c1 L9 [$ [  J) k+ R+ P
# j7 F- m; R6 ], g  v没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* G/ Q) v& z2 C4 ]
  p6 w0 Q+ E/ G. u6 P8 V

- t2 P- S* u$ e1 M# e! o, n5 ~) V" Q& ?: _) H0 Z  y

: b. L. i! W6 y8 X, k
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-11 00:13 , Processed in 0.038661 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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