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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ) S+ ~+ P+ `! I3 q/ m0 s
1 [' r: ^! _& b* }/ v
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( m- M2 Z2 Y/ n& y8 U9 _3 M& U* J
#include <unistd.h>, h, f* T, ^8 c4 g3 n
#include <sys/mman.h>( N+ c4 H" v$ _. [4 H6 U
#include <sys/types.h>
" R, V% k' D* k% @#include <fcntl.h>4 R- K6 j1 m, p0 n
* M8 u1 J5 T' {+ m0 r
#define SHAER_RAM_BASE_ADDR    (0x80000000)   # ~6 V9 c- N5 m

8 p5 j/ Z% e0 V) K) B" `6 mtypedef struct
' N2 R1 p! @5 q' t. v+ k{
. L/ ]/ a$ n, P- Y! s        unsigned int a;
/ t! Y' x; n! h- K* w+ J- T        unsigned int b;, @4 r9 V8 \5 O+ r, O( I
        unsigned int packet_cout;
. k. d+ f% D) e( Y7 f( o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* V" H& N' G, W# h" o2 m8 L

4 {; u9 G) Q7 z# H! P8 O( Dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 w  o: f1 c; ^$ V
unsigned int count_copy = 0;, v. j& D! y6 m% t) R- s) G
9 x. g3 E; K$ j3 _4 |. ~. S$ n3 @
1 B$ x. T/ w' F+ Y% h: ?% D7 I  h. I
int main()
; j) a3 P8 I& u. k( l' j8 z{$ |, v4 W6 T3 B* C" z
        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 d. c4 l+ P7 [  G: G; {        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' u3 S/ J3 e  j9 h* p6 f

  P+ G2 W. f; H# p9 |        while(1)6 {; A, r; y% `6 J) T2 w5 A
        {
/ \# l: w5 F3 q+ S, ~& ?# m2 G                read_MSG_buffer(pshreRAM);/ |. w; n3 h( d1 C
        }               
7 K: t; l- |, C+ {0 Z: a/ s) x& r}
, }' {4 W# L2 I8 @  X
; I5 G3 Z3 K' L9 j! ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- e4 J0 @& Q. M0 B& {, {{
+ w% o% ]) _* a0 s- M        RX_MSG_PROTOCOL buf;) D, C' {/ _2 R$ C: C
        ( b% m( W/ V* S* E2 _& g  E  i+ M
        buf.a = pshreRAM->a;, U. q! n+ d: n. _
        buf.b = pshreRAM->b;' [4 o" t5 F0 Q! w8 L; R0 c0 x" @
        buf.packet_cout = pshreRAM->packet_cout;, U- L6 X$ @% u. e/ {, J
        
/ T4 @7 R& B! Y. t        if(buf.packet_cout != count_copy)
( s6 g# L4 V) o) `+ y8 h( i        {$ W  k6 z/ P& M! k5 \1 k
                printf("a is %d\n", buf.a);
( S" |% j6 r7 g5 F' z! r! _2 G+ c                printf("b is %d\n", buf.b);
: a& M# }2 I$ m% O6 I                printf("count is %d\n", buf.packet_cout);
. Q, x& w: `2 ^% L- r% s- D' r                count_copy = buf.packet_cout;
: Z9 N' m- K% e9 G3 R3 s4 ]        }9 U' e& K4 ~) Y: f8 l$ E9 G
        else
* Y& ]" V9 J" C" n. k8 ~1 ~        {
# ~. m# |' n& a2 E                printf("No effective message!");
2 J9 g0 b  H( Q" G+ ~9 m        }
1 [6 y$ }7 V+ N' z" |}- M- N5 k5 ^# H" A' `
# r! Y9 ^5 ]/ Y" m! L# w

+ S7 i, [/ g2 B9 F但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 V3 ^' Z3 n& I$ j8 C; U9 L使用下面代码,对内存使用了mmap函数后:
* D( ?1 l0 O$ F8 ~0 Y) t- T4 M#include <stdio.h>6 B2 j0 I0 ]. k5 C$ n2 s
#include <unistd.h>) V( l% a' C1 f: `+ q( E7 h
#include <sys/mman.h>
. |% j( }% M( n7 {/ w$ A#include <sys/types.h>, ~  C& O7 d1 l
#include <fcntl.h>; r+ I: s4 |2 ~5 {2 r
8 O) {; E; B9 w  K( J/ \6 r8 `
#define SHAER_RAM_BASE_ADDR    (0x80000000)$ Y6 ^# ^) Q6 X0 @: t+ E9 x1 C
#define SHAER_RAM_SIZE         (0x20000)   % ?- D+ w" ]8 r: D

0 I4 n" H, Q; w" e9 t% w# Btypedef struct
5 Q1 K7 b- c1 e. L4 e: g( H{
" j% j' h, L+ J) ^, d% }        unsigned int a;
" }6 u2 C2 ]5 F3 n        unsigned int b;0 R- _2 W/ z+ @
        unsigned int packet_cout;$ i1 P8 x" @+ N9 k. H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# A: @! Y( I! e2 J# _8 L/ N  C6 ^& `. X9 q- v9 ]
void read_MSG_buffer(int *baseaddr);! x- e3 C" t1 B7 t. o
unsigned int count_copy = 0;
; q/ Y: I+ o0 A5 K% c$ t/ u, e
; \5 J4 C" D& y0 _; V) Q% Zint main()4 Q9 ]# F' k6 C- y+ e; N2 a
{
. e2 F/ I  x) D+ d3 x6 ~2 Z        int fd;
, D2 j7 V3 |2 t) u& c: Q" x6 W        int *mem = NULL;
; x6 a( ^; v3 x! g
0 c! R2 Y6 y( r        if((fd = open("/dev/mem", O_RDWR)) <0)
2 W* ]& h" \1 {: Q' G5 @        {
+ b) p$ h" d: r* p                perror("open error");6 v! F! U8 Z6 `! c+ @! b
                return -1;" W7 U5 O' s' a9 D$ C5 Q2 z
        }0 i* Q" j* ~9 R6 g. I
        
3 {" E, o. V7 O- q        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 m  u) n* M; W- s# D+ ]$ S$ C5 @. k+ b4 o/ V+ q
        while(1)
8 o# ?& C* H# A% k* w# N        {* k  b- [! z5 M6 u
                read_MSG_buffer(mem);: e) m8 Z& [- N$ H. o/ M# ?
        }                , Q( i6 U. E! L6 W8 A1 i
}( s9 w. k% o3 B( D+ l  c

, t! A" O$ N+ V# B7 Pvoid read_MSG_buffer(int *baseaddr)5 d+ r* h) N) D. X& S: `2 s
{
! u! E: [: n6 U" u! ~        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 n& ~0 Y7 v. o- l4 \9 d9 _0 Z8 z! U* _8 g  x$ E% b9 R6 V- A* z1 U7 l
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. v1 Q2 t# G% k: M0 {! u. q7 g& s' ~; c  [
        if(pshreRAM->packet_cout != count_copy)
1 f5 x( {+ R  n  r( u& c8 d        {6 R8 J, b: N: D# z6 R
                printf("a is %d\n", pshreRAM->a);  |( \' b/ \9 A7 r4 J$ k
                printf("b is %d\n", pshreRAM->b);% b6 j6 E2 x3 r+ \0 R3 A
                printf("count is %d\n", pshreRAM->packet_cout);
# D2 E; u; Z/ ]7 }; l                count_copy = pshreRAM->packet_cout;
4 ~1 l3 u5 D+ k$ y' f7 W        }. L0 s8 Y# A. E
        else$ y9 D; j% ~# D1 ]+ d# `6 E
        {/ i' ~1 P+ N! g/ P2 Y4 Q4 s5 u3 g
                printf("No effective message!\n");
5 D$ N2 ?3 H. X1 X* p* [        }
# t1 a( K0 N0 z/ s3 O9 D}0 O  g! }9 }) Q) X& }$ j% l

. w  \3 O* _% m/ {: e没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???/ |; n5 K& Y4 s. H

2 d; Q" H, N2 E: c. ~3 G: J3 E
" D/ a4 ~- I* E& |0 b3 k( \
: s/ G. d- _+ d8 L. D+ i. o' o$ y
' j4 G6 z& g% N2 M# Q/ {% T) I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-25 20:48 , Processed in 0.040187 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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