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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 * A6 S" t+ ?1 s* H

- J2 h3 G3 ~4 e) {1 \OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' J$ E8 @$ e# R% I+ E& r8 k( {" B* w' Z
#include <unistd.h>
7 o" D3 P8 Z3 a5 ~4 ^. l' Y#include <sys/mman.h>
5 f& w4 G! t! ^7 e* S2 Q#include <sys/types.h>8 O* L+ X. A1 v9 e8 j
#include <fcntl.h>
7 O. a! J; L. @) w9 _2 i9 w2 W) m: ]0 l. S% g, }2 K$ `# K0 W
#define SHAER_RAM_BASE_ADDR    (0x80000000)   - u$ K& r" h( f

- f  Y3 P( M1 Z% q: @typedef struct
/ }9 e! ~& n( f/ w( d8 K{
( }' l; l$ M% |- y0 X2 o5 K        unsigned int a;( @+ Y0 }' E/ R" j, k3 R
        unsigned int b;! K% a7 @+ D# {9 l$ H/ a: L
        unsigned int packet_cout;
1 P8 @3 K8 o% M( z* m1 \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( L1 M& l  c& ~) K0 ^( \- h( Y2 K
7 B4 y, V& w  _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" S/ Q3 [. |9 A- I$ J4 Nunsigned int count_copy = 0;
* i* J. h+ r) k! q- @# J) d! B( n- ~+ c$ Z/ Z9 M+ e7 g9 A0 b2 y

; Z/ V& ^" k0 Xint main()
8 Y5 k+ o  U6 \{2 o; M" s4 r7 g
        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 _/ i. L( c( ?/ ^1 ]        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 l2 S! i4 _+ A

# s6 Q9 \( J" [" W+ v4 H, Y9 s        while(1)) H2 Y$ q2 W4 [" J( \
        {
8 A( y9 r* d# v                read_MSG_buffer(pshreRAM);
. m4 u7 U- i9 D        }                2 A. `+ e, ]9 ?- I% Y
}
% X3 Q9 s" `) {" J1 {. q! V) w- @' g  Y7 v- z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 R- J- ~/ D( W  `{
/ ^- g3 c% B8 \4 K6 ]4 [& X6 D" u        RX_MSG_PROTOCOL buf;
# {2 o: N0 a+ H% h        
9 x* B( P9 x& d        buf.a = pshreRAM->a;9 P& h9 L3 \( A
        buf.b = pshreRAM->b;
( P9 h% r* O6 q- |5 ]! ^. E        buf.packet_cout = pshreRAM->packet_cout;* g* p  d% [" V2 ~) L
        9 S+ n) ~6 b1 M3 K' x
        if(buf.packet_cout != count_copy)
' E0 |3 R8 N0 @" h        {
+ Q9 ]* Y* H- v; c3 r                printf("a is %d\n", buf.a);
6 N+ _  B3 X! a% D7 Y; g                printf("b is %d\n", buf.b);% I  e; Y. ]) |/ ]1 A  N
                printf("count is %d\n", buf.packet_cout);
- \7 A+ L# O6 U* n* T                count_copy = buf.packet_cout;
  f6 x7 y2 N( |! P% J$ {/ i0 j        }
9 t, k( ?8 ?% U6 _        else
. _  P( B1 x2 J  R        {
; g5 S) G! d# q1 C' p                printf("No effective message!");& ]! @- |/ u8 y
        }
) r% ^3 G& g& a}
2 F! ~' K4 k4 }2 m; G- }4 H
  o, F1 H6 _, \4 e1 K2 r4 S
/ |  D3 U% e  j, L/ n但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。( l0 W& s* V& R/ K' e# ]  G
使用下面代码,对内存使用了mmap函数后:% {. y" I+ J7 r2 K. L, T" b
#include <stdio.h>
; ^( I% _2 ~) [+ d#include <unistd.h>
6 c& E+ H; s4 {7 s  ?9 |#include <sys/mman.h>% ~: G. n# d* J& k
#include <sys/types.h>1 o7 O6 q3 T' y3 ?: S8 P4 F
#include <fcntl.h>
+ N; G7 N$ d# ^: ]# p
$ Z) A, W  O. F1 }7 G6 K" S#define SHAER_RAM_BASE_ADDR    (0x80000000)
6 t$ o! k5 [4 }/ k1 M9 z* e* q5 b#define SHAER_RAM_SIZE         (0x20000)   
7 K- ^! D% j9 V3 ^- a+ E/ y0 M/ c; ~! Q3 S: c5 K1 K# D
typedef struct/ t: H& `6 a8 K" c1 `8 m
{, J: ?7 w5 F7 y9 H
        unsigned int a;% J0 K0 E! U( _- T- u3 g" b
        unsigned int b;0 ?6 f! }7 }$ f  o  l
        unsigned int packet_cout;2 i7 Z8 N+ I5 a7 Z) z+ Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 w) d- x0 t6 n& O$ ?$ L! U) L
. B, ]. k: y. D2 K
void read_MSG_buffer(int *baseaddr);3 W4 i; g4 }% v4 w2 \& L$ Z* Q
unsigned int count_copy = 0;
! z; |; z6 u/ X3 k5 ~' {- P# y* ]8 i, \: A5 W* `6 @3 y1 H' r
int main()
: d. E+ @- e2 I0 D{0 g3 y9 Y3 R/ N" T2 C, o- k
        int fd;
- I, Q! m+ ]7 B        int *mem = NULL;& _/ m# t0 u6 {
1 W+ Y/ p! O' n( G4 {3 @
        if((fd = open("/dev/mem", O_RDWR)) <0)
2 j0 U8 p# ~# y6 l5 f        {. E6 y1 p8 ?; m' i
                perror("open error");
' C) o" p4 K7 `( T. ~3 f" P                return -1;
8 U# h3 k% [0 k' c        }, ]. d+ k- _5 H# g0 o
        
2 {+ m! l9 c# U2 h: h/ j6 N( S' n        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& N5 v/ k6 I( o2 Y3 g: o- M6 T
$ s( h1 v* P+ [6 t5 B        while(1)
/ X5 v! O  ]5 S2 u9 n" U/ o        {
4 `6 Q" p7 |8 c. c/ j6 V; g                read_MSG_buffer(mem);4 s; U7 e/ @7 k5 K6 B  C+ R
        }               
( X4 B- @& t5 \. O) a& B7 B" r}
% ~6 R0 a- z. g& G
1 ^. \; F1 M% N1 c1 o" K4 E) bvoid read_MSG_buffer(int *baseaddr)2 Y) i0 K0 n3 D! Z" n
{0 o' n' H4 ]! o* }& b4 y
        pRX_MSG_PROTOCOL pshreRAM = NULL;4 \3 s0 z* e; C* x# b6 i
! N3 N4 R5 v+ X- S
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 g2 D9 u- B! W6 Y

" \  y. w* J4 L) T* n) f        if(pshreRAM->packet_cout != count_copy)
5 c$ B) m0 @( d5 N3 P        {; v. I( \4 N2 k* X* H
                printf("a is %d\n", pshreRAM->a);8 Q* M0 t3 n1 ]4 F3 N# z7 m
                printf("b is %d\n", pshreRAM->b);: L* _8 l0 E- F8 `
                printf("count is %d\n", pshreRAM->packet_cout);5 D) A+ o+ d! t3 ^
                count_copy = pshreRAM->packet_cout;
- X+ {6 G9 w) G& G9 E: q/ S        }$ ]2 q+ H$ ]3 a# G* y/ d9 f
        else
; W: F5 ~( t/ ^; @        {. t6 X9 V* ?: c! T1 B
                printf("No effective message!\n");
6 ]# ]- _5 g0 R$ H        }  R+ g0 ^0 [# J( ^! H( X) t
}
7 h, l9 G; ]+ n, t) l+ ]+ E
" @, z7 F( Q' ?2 w/ ]/ e) ?0 ?没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% i. H% D2 i  |! \- ~1 ]1 u( @
- j4 |1 ^( q% |" Y# n3 }' d# g

: [' T8 K! ]: ?* E- v) q
! l: _- Y! t2 Z  ^0 }& X5 D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-30 22:10 , Processed in 0.044486 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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