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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) p9 u4 S+ I8 r9 {9 G
$ D6 w5 W$ V0 eOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>7 L% v% \% `( p" P% w5 U8 s
#include <unistd.h>- Y6 C$ B. \" T4 O/ z5 ^3 d
#include <sys/mman.h>
% Z& _3 J! p+ N# E0 E7 B. S' o#include <sys/types.h>
  i( ^9 _9 d( V  u#include <fcntl.h>, C9 N/ N! s3 i2 E
% L, K7 `5 t, H* N* a$ d1 {" D
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
8 [) P7 s7 @! q+ C# E6 P% g% `0 \; ~
typedef struct' N9 I+ g( Z7 w
{
* q2 s$ T: Q6 {- H! G* v% T        unsigned int a;
; w+ j' d' L7 X" L5 w9 C7 @6 ~        unsigned int b;
9 ~- c: e2 p* c8 b        unsigned int packet_cout;
4 z( Q- @- x% x, e) Z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% {! O# @  R$ [" i: |3 q
+ e5 N+ e5 c5 L& g& K0 T9 n2 p# o2 f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 d  L; v8 ?: L1 O+ s1 R# I4 T2 ^unsigned int count_copy = 0;' s7 }7 q4 R4 s: h: k6 M
- i; f2 @: D3 o8 Q4 L' D
. S- @0 E7 Y# Y1 w/ o3 w& c
int main()
5 Q9 a$ L" {7 M9 {  |{4 N! M& ]* f+ K, Q1 a
        pRX_MSG_PROTOCOL pshreRAM = NULL;
: ^& i3 r3 s1 h2 z: B& [        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 `3 z+ ~+ T) z# C* K

" v$ l+ M/ h( z8 E  v. \        while(1)
* v, _) ^( k/ p! ^5 k4 s( F        {
& w! j3 G4 ]3 O3 B9 T+ M                read_MSG_buffer(pshreRAM);
% q7 k; q& f; m8 ?8 J9 V        }                8 X9 i4 N* h: w' F# ~
}
: J0 r& H! P& t* X& K
- H- f, M4 g1 @9 e8 i+ ~: D3 Tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ J# }7 D; L: o{5 F) f5 G" p' _& F3 F' U! ]! G# H
        RX_MSG_PROTOCOL buf;5 C8 c  V- X3 [- P) h) t/ G
        # _! q4 o1 C* p3 }4 h* O) F) {
        buf.a = pshreRAM->a;: c: e/ |3 E! B+ z
        buf.b = pshreRAM->b;; A1 J3 q+ m1 N4 }5 p0 ]
        buf.packet_cout = pshreRAM->packet_cout;
6 L& m$ L6 O! f4 H: t2 P        
: h8 X* N; \* x, r        if(buf.packet_cout != count_copy)
/ u2 \. l  }9 q4 p        {8 H7 k/ O3 R1 Q5 l, r
                printf("a is %d\n", buf.a);( ]$ _5 y: _! s/ J/ G, p; ^6 }
                printf("b is %d\n", buf.b);& r, q0 D/ T9 l" J
                printf("count is %d\n", buf.packet_cout);+ I- |' }  Y% h( Y% @
                count_copy = buf.packet_cout;5 D7 n3 Y, p$ P: M* H2 E
        }
& y; |+ k9 a; h+ o        else0 J: g4 C) R; o3 E! f
        {
2 b) d* n+ S7 N" ~                printf("No effective message!");
- l* H2 X6 U: t( v+ E! A        }- v. I  Z  M& g1 Z0 [# t  J' D
}" m. H  e2 g- S+ X' Y: I. V8 h9 Q
7 [  l1 s6 t# k: N: `$ s" x
5 H* g7 B7 Z" P, a$ B% \' R9 j
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! S) t3 `* P  Q/ P8 `使用下面代码,对内存使用了mmap函数后:0 B! K  t! K- C0 `7 a  M
#include <stdio.h>
; b* n* y% Z" h. b  s5 Z#include <unistd.h>
6 v4 P3 |4 z" F% T8 B" w6 h#include <sys/mman.h>. F/ {9 G! Q2 ]; v( E4 z
#include <sys/types.h>
% q4 M6 e: l- ?' d* k0 E#include <fcntl.h>
% D* l. \+ o5 \  u- Y. u# _$ b6 D% f* n) d8 f/ \  `$ F6 b
#define SHAER_RAM_BASE_ADDR    (0x80000000)! F3 Q. D# _8 M* a' V
#define SHAER_RAM_SIZE         (0x20000)   % w0 S" ^- R# c3 o+ A

3 C2 h0 w+ C  O5 {% o/ rtypedef struct
: m8 i# |- O8 {' M{: R# b* }+ K& {5 @  t' T! t( E
        unsigned int a;2 }! }4 {, @: D8 ^9 w% b7 B
        unsigned int b;) \. c; o, W" H- q+ Y
        unsigned int packet_cout;
( I- h0 @2 m1 E3 U* e" A, u! j9 _}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 [6 S$ H+ H  h3 s3 s) s6 X
* e( ]1 J2 m2 s, n6 C( I: }' wvoid read_MSG_buffer(int *baseaddr);3 r! M$ d2 G6 Y$ ?( f+ C& n& s
unsigned int count_copy = 0;
9 o" C+ @9 o/ ~  ?9 t9 t' s  a" [2 n
2 @' l( p: h: t( i' ~int main()
' K* o$ r& G3 u# ~: G/ ~4 V{
$ g# _! D* I" V7 w8 G9 w* a9 t        int fd;
9 k9 l+ H2 A, g; T9 ]/ j$ @        int *mem = NULL;; i8 M1 u, [( x

4 I% V3 P' M9 V( A) m1 K        if((fd = open("/dev/mem", O_RDWR)) <0)/ c. y& K; p  E  k
        {' J/ z1 h3 I* L
                perror("open error");
1 R& W$ N, @; o" i: z+ L                return -1;! D: e# f1 G4 t- y( b
        }
# e" K  E/ y. |+ @$ j$ y% y        
( L2 [  F0 b1 D5 y        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ a' |8 J% u) K: |7 k
' y. g: I7 r6 h. \( a        while(1)
! D6 K; [+ q& @0 o+ a  y) e        {
. i# y6 Q3 ~8 X, c3 _                read_MSG_buffer(mem);
4 z; ~. y6 N. Z9 I  s4 ^. ]        }                : Y% ?/ T3 {4 [
}8 L5 N+ b9 o# d8 c. r
4 R. z$ c7 M# X( R7 b% D
void read_MSG_buffer(int *baseaddr)
( p4 I/ z* Z1 u& ?{! ]4 b  ?, l9 E4 H
        pRX_MSG_PROTOCOL pshreRAM = NULL;7 t/ t; u' p; ^4 T" q1 c

; F2 h6 r  A9 X; p6 u: k. F6 o1 z        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* j  O( R0 \4 ]" a! u

6 B9 S: Y* A8 L/ ?        if(pshreRAM->packet_cout != count_copy)+ P( }9 S: L6 c# t
        {
- s7 R% @9 {9 V+ M8 h7 ~; o/ G                printf("a is %d\n", pshreRAM->a);. F) ~0 D# I3 l/ _$ G+ V- T- b
                printf("b is %d\n", pshreRAM->b);& J+ d6 s" Y2 w3 i  E7 Z% }" Q4 z- ?
                printf("count is %d\n", pshreRAM->packet_cout);
7 z" ?* P+ i# d                count_copy = pshreRAM->packet_cout;5 x: R) k+ v% R- }: c/ [
        }
) r8 z, d5 |8 E" Z: k- f        else+ t% h, ]- n# ?' \
        {
8 s& b: ~0 S; l/ z3 {" r6 a                printf("No effective message!\n");4 Z  _; {0 K% O
        }
( u" _0 C7 \$ ]# w6 ~}; O7 ?( {- I5 }) c6 v; f

3 ]$ O1 f- l- `# p+ @没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; s8 h  c* I% {8 s* Y1 x+ k
6 n9 ]6 a7 H% J  B
, i- E  v' z! O2 g* g5 d
+ V0 a4 ]) ]& @* u& f) ]' {. Q) D) Z7 E6 x8 H/ |4 P* ^
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-8 14:19 , Processed in 0.038000 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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