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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 4 r3 A- s  ~. R1 n) X" f  x4 K
  v% Q$ V* \4 n6 O& {  w7 s8 J4 A" c
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>5 Y9 [# ^2 {  N+ s' X6 {, {
#include <unistd.h>$ V  B/ E! V: q, e( @. Q- B
#include <sys/mman.h>
# d; y( b, l& ?5 n+ F/ M( z#include <sys/types.h>
5 q5 j4 O7 `1 T  ^7 Z/ h#include <fcntl.h>- P' L( F2 H5 S2 v! t

7 L2 @$ {! D+ r" h, ]#define SHAER_RAM_BASE_ADDR    (0x80000000)   ( q. K1 R: D6 ]+ f
$ N5 h0 X2 P7 {" y7 A; x
typedef struct
! r' Z- }% o- C  ^4 u& P{9 u. R3 l( L/ `: Y$ x
        unsigned int a;* M. [  Y9 D  I, K& j" J/ V- `0 I- ]
        unsigned int b;
5 U: I: h# m& _        unsigned int packet_cout;9 |  J9 L" {  m2 _
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 ]8 P2 Q# g" g* n! Q1 f
9 l5 T6 S+ S4 N: I6 a1 Y; |* C) [' `  f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);; v5 P, F( z% V+ P& K. ]% v; ?
unsigned int count_copy = 0;
3 Y: i" @: g: D1 p9 M* C, Q  H7 I( M
) }' m7 i5 l& A  v" {6 @& F$ X
int main()& j8 I4 D" R$ |/ o' J5 X9 K1 R
{0 b6 P, i9 l4 g
        pRX_MSG_PROTOCOL pshreRAM = NULL;
" d4 _* p) g/ O/ q( o- J        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;7 H9 G( O+ [9 d) t  z4 W1 Y

7 H. D' `$ g$ U! T" X' Z        while(1)6 J4 T3 o8 n7 t& p2 S& c' i9 l
        {
9 H+ ]& D5 i  m6 m# l$ q- g                read_MSG_buffer(pshreRAM);
$ l+ z: Q1 F! G# m0 J4 Q        }               
' A9 m2 W6 X! i; |1 l}
. O4 m/ e/ _; R' u4 y) P- Y7 s4 z7 {# I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% f; g4 m! k8 X+ z) P0 K
{
. ~5 s% p6 l+ k2 ~6 w        RX_MSG_PROTOCOL buf;
8 X- T1 t" L5 H4 N  o  K$ R) s( Z        
" J9 O& k2 s6 o0 ?" W* ~+ o6 w% f        buf.a = pshreRAM->a;' O& k( k, s/ N/ L3 e
        buf.b = pshreRAM->b;$ T, j+ t( P  X
        buf.packet_cout = pshreRAM->packet_cout;
; r0 Y8 f. ~$ g7 i4 \        
. P5 A6 [8 _0 P! w# j        if(buf.packet_cout != count_copy)
/ J, F  p; ~* _* r8 B        {: s1 J4 u9 x4 X9 Q% z4 S
                printf("a is %d\n", buf.a);
8 B4 u& f3 A7 O' G                printf("b is %d\n", buf.b);- l% P/ r9 u. ?, n3 W* h' |
                printf("count is %d\n", buf.packet_cout);  Q" M, R9 g' m+ U8 o
                count_copy = buf.packet_cout;
) R% V1 d8 J- M4 k2 l& R; w& d        }
9 M! X0 [8 h% u3 D        else
+ B' v+ L$ v  G& M        {! J* S* u( d) l  Y
                printf("No effective message!");
$ C5 I5 H5 v/ t% U        }* y: Z& h0 G$ c: x* h; g
}
  Q5 x+ Y+ f: d8 ^7 {" |! f+ S# D: F9 h' S0 B
8 |# S+ l, U3 Z' u% ]2 p/ c# B
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 q! y% e  h- S. j2 b; ~0 A. j使用下面代码,对内存使用了mmap函数后:
) b; w8 c# W4 M4 ^* F#include <stdio.h>4 @" G0 e2 h1 M; G, s$ r- N
#include <unistd.h>
, p- A3 [) z- T6 U#include <sys/mman.h>, v2 |3 k3 _" T& }3 @) @3 P1 m
#include <sys/types.h>
: i, _" }' [7 b#include <fcntl.h>
7 \2 i& |& z5 }9 F* [- p  ~$ k4 k; [6 B5 R
#define SHAER_RAM_BASE_ADDR    (0x80000000)
4 c& P4 k# H- F9 r5 O) P#define SHAER_RAM_SIZE         (0x20000)   # Z: P$ [# A6 e) U( U( ]8 ]
$ A9 c* W( E5 I) i! f2 f$ B$ v
typedef struct3 ?8 l7 b0 |5 Q% l
{' Z2 A9 ]' p7 J9 x, N' j0 v, z2 _
        unsigned int a;$ z, a6 m# x  r4 g3 S  ?
        unsigned int b;1 @& r5 H; w7 N$ U2 E. [3 J
        unsigned int packet_cout;9 Z8 J$ D! N8 ^6 g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, x& V8 R& e' R& C) |4 |

4 ~( F6 H+ S. l$ @  \# Evoid read_MSG_buffer(int *baseaddr);
7 i' ?8 _/ \0 D( @% i( d" Vunsigned int count_copy = 0;
% p; J( O; H) z9 x) O- n
2 \( o3 C* Q- [  S, Dint main()
( a# f/ E7 L! Y. A: i$ z{
* ?' W1 w& {1 @/ B$ D- N$ y* R2 A+ `& {        int fd;
$ N5 o- \0 e! V+ s' F        int *mem = NULL;1 p, i2 o0 \* c  R9 x

( h  }7 `) B$ z: s; D& Z4 x        if((fd = open("/dev/mem", O_RDWR)) <0): {9 R4 w8 v/ p" w7 X
        {/ F8 t5 Q$ ^; ^" [0 U& R* n
                perror("open error");1 X4 s/ K2 C, D) x
                return -1;
; n3 J0 p! C- O9 [7 z& t1 h+ R        }
3 q) A# K( m! F5 C% ]$ N( O        9 t. n: n9 `- ]5 u* G
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 P6 F) O6 d9 J& Q
& j" }! b- |. V% I        while(1)
* I+ S3 ~! Y8 B' u' B9 g        {
# r; Y8 m0 j: E* f$ q; n                read_MSG_buffer(mem);; l! f+ N0 M1 p/ M7 E! V
        }                4 d$ w% l& Q5 y
}( m+ W! w; V" u2 X4 b' [; y

9 N% M& `. e" H: O/ vvoid read_MSG_buffer(int *baseaddr)+ _7 p/ T- t7 y1 _  z- ~
{
# V" I- y& g  ^1 W! y9 @( D        pRX_MSG_PROTOCOL pshreRAM = NULL;  O: D8 S! S6 c5 W* U4 O3 \- V/ n

0 j, T5 X7 O3 d- V# `, d) i3 l        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. |7 A( |4 n: l0 O9 N9 k3 v5 S, c  q" X4 `" B/ A  y' X# h) g
        if(pshreRAM->packet_cout != count_copy)3 B! g; M  h' |
        {2 E4 U. y4 I+ J% k9 o
                printf("a is %d\n", pshreRAM->a);
2 R4 Z5 {" U& a% z                printf("b is %d\n", pshreRAM->b);
! R; h. |3 J5 v                printf("count is %d\n", pshreRAM->packet_cout);
3 {/ `# L1 J- k: p% @: E6 e, c! U                count_copy = pshreRAM->packet_cout;3 |0 V- I6 _7 K! u- u7 H: v2 @
        }
# X+ `9 ^2 i* E8 ?        else
! C( i/ b9 T9 w9 C1 @* ~/ u        {
0 @1 f* D* e9 l+ I* }, o* L) J5 a                printf("No effective message!\n");
$ o9 s5 j9 T4 k2 n9 {- _' v        }
* R6 g' i' c+ s- g' L5 R}
$ f1 r) y: t9 [3 z0 W5 {$ h3 N6 @/ J7 e$ u1 Z, W) G
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& Z6 _  ]/ p8 q% J' }/ q1 P& E! V0 \' S" Y) F) f) @8 Z3 y
% s$ S1 b8 M# R- G
8 X7 J, D( c9 B

+ f7 t# ]' X/ ~2 e! W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-1 08:20 , Processed in 0.049427 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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