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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' ?* f/ J; T7 t4 ^; X
- {- B$ a, v4 G" r! M5 C/ MOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! r6 W: h- n% P* Y1 |) e#include <unistd.h>
# P6 n; K! a- S# f#include <sys/mman.h>
2 ^, b8 K/ `  N! A#include <sys/types.h>
/ A0 a( ?& o- C+ F" E#include <fcntl.h>
( f. a6 `( [! z: Z5 u: i- o7 J- [4 U, K  t! `  p9 e5 m
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
' h: J0 C6 C5 k2 U- [, P
2 O8 g' L) z8 m0 y' |4 ptypedef struct* ~7 S! ?7 C3 B5 O# Y
{
- J! \4 E. C3 d- F3 t; B$ `        unsigned int a;
8 W$ b( E4 v5 p+ h  T' o5 V8 b" r        unsigned int b;1 Z* P, V8 L8 ?6 ^2 u( e, @
        unsigned int packet_cout;' C; m+ T% b+ t- K# @  H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ k- z1 E* N9 h0 Z* s& {) `" t

3 k* F3 k. {) Y8 q+ C3 Kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 J& H0 D- O6 w6 D4 c' cunsigned int count_copy = 0;
+ K5 E$ ^1 m( M3 C/ R0 N1 \- Z* c. C* l6 o

! g2 a! m3 _$ @7 A% Xint main()2 I! _) H5 m# H. I6 T
{% i! F# p0 }& `1 X6 ?: z
        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 E( Y- }4 r: G- S/ o        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! N' |0 T3 Q) |& M

: Q) N4 E+ H- c3 z5 N        while(1)5 k, b1 ?* l  D3 C% Y
        {
( X' v# j" N) b" M3 b  e5 R                read_MSG_buffer(pshreRAM);
# z( C1 W5 d5 ^8 A! Z6 C6 W: N. l        }                ) o& b0 ~5 u5 y
}2 i, G; b" _! B, v* C0 e( V

( _; l1 {% P6 Z* y  \4 v2 ~8 ?' g; avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" p9 T% J- A$ e9 t) I( w0 h{
7 S; W- s$ b- o0 `7 u" g; E1 S  v! k        RX_MSG_PROTOCOL buf;
( k% ?4 d6 l( a# h. a% _        
+ Z& x/ L& M; o        buf.a = pshreRAM->a;  d! p2 I9 N, H: K
        buf.b = pshreRAM->b;
4 b  c6 U4 F2 {7 m% {6 m% h: ]2 G        buf.packet_cout = pshreRAM->packet_cout;' p8 i6 x3 Q3 ^+ E
        ( J# I6 }- _  ^5 U
        if(buf.packet_cout != count_copy)
) I! ]8 E# x1 R) x2 |        {; [0 K$ K; }$ o% }5 V, a
                printf("a is %d\n", buf.a);
7 G' w2 _; G/ _1 g6 s; y                printf("b is %d\n", buf.b);
& c. G" X2 ?( p* j                printf("count is %d\n", buf.packet_cout);
; g, S8 s7 k% I- j0 U                count_copy = buf.packet_cout;1 K% A6 Q2 ~& `9 O8 \
        }: }$ I; h# U# K
        else
; e7 s' Y4 l3 G9 L        {
1 u1 y" W# O1 R! z4 I                printf("No effective message!");
8 o; v( n: X" T* R6 p$ F+ U1 t        }( S* @7 T% u4 I. @! |3 v
}
8 x9 f, a6 f( N# }# g, o8 C" ^$ n/ n
# j& Z/ F2 v" G# d
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 {. T* ]4 H/ {6 ^2 U+ O# O' }/ j, ^
使用下面代码,对内存使用了mmap函数后:2 M6 l- L6 j. ~3 I. F4 N2 t# I
#include <stdio.h>, T5 T" O" }. g( @
#include <unistd.h>
* d1 g& y, P! @) ]2 M) y( o8 A9 C#include <sys/mman.h>
% {2 }! u3 |6 y, r7 [#include <sys/types.h>
: V! v7 ]1 A! d9 X#include <fcntl.h>
! ^* p7 q% q, p4 c% m% i: d2 H7 H- ^7 h" f
#define SHAER_RAM_BASE_ADDR    (0x80000000)( i4 n5 |8 A0 L2 N
#define SHAER_RAM_SIZE         (0x20000)   
, C9 o1 L3 J$ ~; d& q  r( s
$ ]- L! }; v8 u4 ntypedef struct
9 p% f7 }4 L8 o% {- d, _{& O0 L. e  U/ W% U( m* h# H
        unsigned int a;
  d4 N! s3 `7 y5 F9 @1 k5 J        unsigned int b;2 O, x: B& `! O! l
        unsigned int packet_cout;/ M- v  p# H7 g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; k4 K9 n7 z/ f$ r8 l4 T  Q
8 u8 [" d( u4 D* Y7 x5 lvoid read_MSG_buffer(int *baseaddr);% A, M  h4 d  t  J: X) _/ D
unsigned int count_copy = 0;
5 \1 P7 t; ^1 ^( X, S- i' J! N+ `6 k4 w! s( w
int main()2 p) g( d9 h; C2 {
{1 l; T( ~' J- \- t) a
        int fd;
2 H7 {2 Y2 G. c2 I- u; h        int *mem = NULL;' a# i9 ~' I& a2 ^

% S6 f: _1 H4 L+ K- k        if((fd = open("/dev/mem", O_RDWR)) <0)
# q/ O5 u: m4 K* z5 V: ^; z        {
4 m! U7 _4 A* H; s# i) W                perror("open error");7 f  N9 ?5 @1 b1 [5 B) Z; V$ k$ b
                return -1;4 i/ [+ {: O0 c/ t1 R' l
        }* Q3 h2 g7 P4 F, L# Q1 R  k# G; W
        . w6 C% {: x( x5 n  Z% S2 E  L
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);. M% i6 w* e. U  x1 P( s. k

5 S$ J# j. w4 ?. `        while(1)6 x8 i; R( l& m: m, Z: u
        {
1 z6 }4 t+ [! ^$ V                read_MSG_buffer(mem);
2 A; b1 q  `, x1 T1 n, Q        }                % B8 X. J- g" B' M9 X
}8 D+ U' I' e' _. t, Y0 D6 G
* ^: D& k5 H  \
void read_MSG_buffer(int *baseaddr)
7 b2 l; M# `0 K7 ?% o{7 T# H# `8 q9 {. d1 E# P! {- w
        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 d/ o' o$ C! Z7 y% ^6 |! b7 }' W7 M1 c$ z8 q1 z! Z# B& D
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ ?0 C3 E* V& |* [$ q6 m- L

: K% A0 `" M' ^0 u$ }        if(pshreRAM->packet_cout != count_copy)0 t, W, C3 I6 G& M
        {) [) C$ o0 V) v# b$ \* l
                printf("a is %d\n", pshreRAM->a);+ a/ @% v7 i- k/ P3 E9 K% b
                printf("b is %d\n", pshreRAM->b);) X  Z  Q! h- f# K* l( R1 H
                printf("count is %d\n", pshreRAM->packet_cout);+ C# f1 ^1 W6 A/ ]7 _
                count_copy = pshreRAM->packet_cout;
/ U% ]  J& C% I% M: |' \        }. G, U9 Z* n9 `% J9 A0 A
        else8 \5 _# q0 Q0 y; L+ C( \
        {
4 W3 c1 a; w1 a( Z                printf("No effective message!\n");
9 t# a" H, c6 C, y# F8 y        }
. P$ F5 d8 h/ H$ U7 w7 x6 c}# ^7 y* w+ [* n4 e2 h! q
4 k' u$ B9 ]6 i) ]3 C- A
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???0 Q6 N% j$ d. K2 Z0 N  T* n
6 B$ w' J& c9 m) i$ {! q

4 X! P. x* F1 S. [5 O
+ }; I$ l$ s) N6 [4 K. w
8 Q  r& b, P$ m& x' U' |
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-4 23:18 , Processed in 0.038549 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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