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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 t4 N9 ~& z& w  R! _
+ O9 }. o4 o' W' h. h0 E6 D
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 c- ]8 T6 {( R% D9 p
#include <unistd.h>
, Y/ F4 i" L5 D+ R  ?0 W#include <sys/mman.h>5 {! ~7 T/ m) S6 n4 j
#include <sys/types.h>
- H/ N, g5 P/ f' Z9 J% w#include <fcntl.h>: W9 i; X' U% _$ U6 Z4 p: E
( h- ]5 \' c/ p; \8 V
#define SHAER_RAM_BASE_ADDR    (0x80000000)   9 V5 Y- }% K8 O+ u: \- E) K

. ~" J' z& `& E9 g" J+ B1 \8 Dtypedef struct
! y; r% U) @* J. Q{
9 l+ ?- F6 N  T  [2 r5 [6 k        unsigned int a;
: O) c1 J9 n: I1 P8 ^; n% _        unsigned int b;
! ^: l) w2 Z; h5 {        unsigned int packet_cout;" U/ V5 _, f- X7 |# ]/ i( W; [* ?
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 E( M2 q* F) l1 S/ {: M* v# l( ?  g
4 x9 i& z9 `4 C7 G$ I2 A. A; U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);  t$ |3 K4 @  f+ \4 I, s
unsigned int count_copy = 0;2 E' b7 P% w; }  K# X

& R% [5 c# Q( m5 C" r( r: v, V- b  ^$ Y- f$ M
int main()
# ]/ {. b" _  T! t{* i* u, |5 C. e. g4 m. {: R7 ?
        pRX_MSG_PROTOCOL pshreRAM = NULL;, V* i( F4 e! \3 U( T3 a
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ {4 F5 C, B& u9 v9 P% z
6 r. P1 b! t, }, K. c; r- z        while(1)* W+ _4 c8 i7 @! k; W7 P' L
        {
4 A0 x$ ?" ^0 a: _) }                read_MSG_buffer(pshreRAM);
' p( O9 l! F1 T0 y2 Y$ b* t        }                $ c* y# {4 b7 G/ l) Y# u7 D& @' O
}& L2 m7 d# |% e- ?5 c

9 G7 J5 r, U( j' k* x7 s+ v! ]void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)6 r" k5 w6 h# _8 A2 F
{
" K# M, u& |1 V# ^& r' M) v$ [        RX_MSG_PROTOCOL buf;3 q5 L1 D- f" y8 L+ B
        
/ \& E% {  B5 }% E+ V5 s        buf.a = pshreRAM->a;
; S0 v- Y0 O- j9 p8 Q  |/ T3 E9 k/ o        buf.b = pshreRAM->b;4 a0 q6 a2 R3 _8 u* M
        buf.packet_cout = pshreRAM->packet_cout;7 d6 A8 x% y! \; c; G7 |
        % ?; V( }. c+ K6 y8 m( p' x; I
        if(buf.packet_cout != count_copy)
5 g5 J$ e. m; s" p        {
9 A* E& L6 l5 i1 c                printf("a is %d\n", buf.a);0 {8 j9 d0 E* f. G$ n- k
                printf("b is %d\n", buf.b);
( W* S  s- G( L# ^- w$ H5 E: s, [& a) e                printf("count is %d\n", buf.packet_cout);
6 x; n. F* O. d6 T9 R8 [7 p! I2 b                count_copy = buf.packet_cout;. n- {1 L4 Y$ r$ }2 K
        }5 S& g" {" N5 p4 b
        else
3 y  [4 T  Y5 t        {/ W  L! r& E& C$ ]6 y* _
                printf("No effective message!");
4 B- w" ]( U5 H3 _; ~        }
; `: _( b' S7 F7 n+ D}1 K5 Z1 g1 _- `6 Z2 m, q( E
2 N+ {. b% M2 H& h2 b/ o

8 v1 y7 B- I+ K% H但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) t) i8 X0 }3 A8 U  P8 G使用下面代码,对内存使用了mmap函数后:
6 d5 }/ o( G* }( c#include <stdio.h>
+ m, r9 K% }1 z5 P# f/ i3 g7 {, }" z#include <unistd.h>
% _- O5 E0 Y2 E$ ~#include <sys/mman.h>
1 B5 J0 c2 s! W1 z4 M/ Y: m#include <sys/types.h>( x% ~" Z) ?  `# j
#include <fcntl.h>4 r' x0 i( M( |. V/ _% f' q+ k* K

5 u: d+ a  [$ O. e) t8 D' m. s! }#define SHAER_RAM_BASE_ADDR    (0x80000000)* G% T: \; t8 c9 [  D
#define SHAER_RAM_SIZE         (0x20000)   / T1 ]# h' Z, L  a+ U6 K) q
: I. @3 [0 h8 x% g
typedef struct
' j- s2 s$ F2 X9 U. l{% M+ g& M5 _' n3 W
        unsigned int a;. p5 X+ S% k" h
        unsigned int b;, }6 m8 T! s7 Q0 B8 @7 i% l! d4 f
        unsigned int packet_cout;
' O- E  |" s; A0 b. E/ q+ V}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& D2 Y* F3 Z2 r# U
( h2 O" R, j" n5 c, }6 ?
void read_MSG_buffer(int *baseaddr);
8 k/ E+ B$ c0 o% j+ o/ P" f9 T, p7 S) Eunsigned int count_copy = 0;
- i  N- V& l2 P2 o- C8 s+ ?/ g0 [* h) H  Z3 U- ^& d  q2 k
int main()' a2 c7 Z, W+ {& U0 M& t
{
1 y0 l( j9 A' m        int fd;
$ y& s+ M7 m8 f2 ~, [- P        int *mem = NULL;& y6 d) R$ _. t1 e7 w. n
8 W+ }# @/ q7 Y; e0 W; P# `# l
        if((fd = open("/dev/mem", O_RDWR)) <0)1 @9 ~! r" t8 T6 |
        {6 }# G! m1 G3 ]8 h: M2 O
                perror("open error");
9 V5 C- y& O6 Z' v                return -1;
! a# F, [& G" r9 ?* b' y0 N5 M8 u        }9 E8 C% q0 R: Y% T6 Y
        4 c0 |3 \( @. F0 N, o
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- }+ {  @1 l' Q1 k' C3 y) t
0 z4 z" q) h9 X, R9 K        while(1): E4 k! n) d; i: u
        {+ j4 S, m& \" t' O* {7 r) f$ x1 c
                read_MSG_buffer(mem);6 a+ t  S+ z6 T6 M' c8 @
        }                " }; |1 V! \* ?2 Z
}
# h) G0 z( ?$ A
3 _9 z: y" h! h; L$ d+ Y) t2 |8 }# tvoid read_MSG_buffer(int *baseaddr)% {" T* X4 Y, @/ ?. ~& W
{( Z1 t* N' }% N/ [  g$ w; r
        pRX_MSG_PROTOCOL pshreRAM = NULL;+ u! N$ H2 ]  ~/ _7 E' I' Y% C
5 }- A/ Q7 P( T/ F2 k
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: Z4 J( n7 S4 c$ L" f  N9 n

2 r# A  L) S* H+ j# t2 \        if(pshreRAM->packet_cout != count_copy)
/ D& d; E( n" P        {
+ m* B6 ^1 U0 B3 P. }! z                printf("a is %d\n", pshreRAM->a);6 P; A8 F$ o( s3 \# `
                printf("b is %d\n", pshreRAM->b);
! g. N( `4 q( s4 w$ q; X                printf("count is %d\n", pshreRAM->packet_cout);5 `8 \# U. _! l7 O; _: w3 A9 A
                count_copy = pshreRAM->packet_cout;2 C( j/ K' v+ X% V
        }
( T! [% b6 b' m8 m* s/ ?0 M6 H5 q3 k        else
5 K! z2 s% l5 D8 |# Q7 ^        {
' T: V5 a7 i# k5 F3 p8 l                printf("No effective message!\n");, E/ W6 e4 i& e6 ?% ^
        }
" U; p7 s+ A2 T7 P; A5 T2 J2 f4 M}9 y5 o" D4 `4 H. c) `. E

" w/ Q0 s9 f7 `8 d0 ^2 t没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 G% C" [! a* f$ M
' m" K0 g) R, j& z8 \* b1 p
# k! J0 f5 _4 K- {3 L; @& j/ H3 I6 m7 R1 ^2 `1 ~- Y

/ g. T0 S- L$ }% S/ _; z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-19 01:09 , Processed in 0.036985 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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