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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 m8 E+ \  N$ q1 q8 h8 O+ ^; ~$ d5 `" x! {9 ]- Y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>. ^* E" r; I& L# R" l
#include <unistd.h>/ s: Z3 N, _0 E' i
#include <sys/mman.h>
$ E( @/ a  S7 z$ {, A. m. o#include <sys/types.h>
$ L% u$ M7 N* h0 _" m9 `: H5 J/ Y#include <fcntl.h>+ F% S: o. d1 Y. ?/ r; j& g

1 f5 X, Z$ x% K* G! c3 a#define SHAER_RAM_BASE_ADDR    (0x80000000)   ' M7 z- W* D8 b7 ~; `  {( Q' J
" m2 m; V  C0 v' h' W0 o1 i2 _
typedef struct
  d/ J- S# {, t) K. C% z{
# s  Z5 C. P, u5 A5 K- x        unsigned int a;
8 u2 o+ o3 f7 M- P, {        unsigned int b;
" W- u( o0 M/ V7 ~" X8 H( Q, Y, ]        unsigned int packet_cout;' h4 }/ R$ v6 }! h. h# z/ N" J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 i: O3 r) {. J) y( J8 C8 u
% ^6 s1 w- V6 V% l; F# l% Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) h4 S2 [( C! d! Q- Ounsigned int count_copy = 0;
$ g8 J9 V. x2 |* g/ L6 g7 D5 H2 ?3 K* h) B: @
  D2 ~! y7 {  d1 q$ P& d/ R  C
int main()
6 ]5 J6 P2 e$ O0 ^{
' T. E# s; W' h3 J        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ l0 v+ A; N+ `7 j        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ D, o0 `/ L" `( \
' |! Y" \0 E- u# L! B$ A) |
        while(1)+ {" [  c/ m. P2 T
        {5 Q. v% m/ s- M. g
                read_MSG_buffer(pshreRAM);0 _" M% |# Q3 W8 L9 G
        }               
# P* ^: o' j- _& U+ w}5 J  p* f, M6 d( m
6 V' e" O' o# J3 U: P. L+ e
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 l- G) O2 ]  e
{# }$ s  a7 w3 ?" j" C+ [. f: b4 C" u
        RX_MSG_PROTOCOL buf;' _+ W& W  b" b/ n
        
' j/ p9 E$ b3 ~6 [+ Y        buf.a = pshreRAM->a;) @/ X1 j* r5 t
        buf.b = pshreRAM->b;
* H, }5 I3 ?$ k9 F        buf.packet_cout = pshreRAM->packet_cout;+ ?9 n: a% v0 B! a  w
        # N# `( G. G8 d- {5 W# R
        if(buf.packet_cout != count_copy)
1 H) ?# \1 g6 g0 I        {
- G, P# V. A/ S- ^1 d6 ^2 f                printf("a is %d\n", buf.a);! V1 _9 [; P( K# T) X+ h/ y4 C
                printf("b is %d\n", buf.b);; y  d8 F% I6 T) ~7 W
                printf("count is %d\n", buf.packet_cout);6 j, Q5 y1 q' \& u4 B2 _3 G
                count_copy = buf.packet_cout;
  l* U0 b9 H0 N7 B- P        }4 o$ ]% `  n* x: G' R! y
        else7 @+ H/ w4 I4 \1 i
        {$ D* Z# w2 F* ~) @& m
                printf("No effective message!");
+ P9 B2 F5 h3 [( N% I        }
9 _& z2 `) D( C( I$ w}# v( D. y; |9 j/ L# Y0 T6 B0 A
5 F7 O+ [1 u- S9 t8 E9 t* I* K

1 o" G' A/ Q% f5 a" J- V: e, G但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 I4 b$ P1 N$ f1 v! K1 ~7 ^0 L1 W使用下面代码,对内存使用了mmap函数后:0 I  {" q  K' K, o. @1 C
#include <stdio.h>
3 M/ [- t$ ^8 d9 N$ s" E9 z0 @2 o#include <unistd.h>
9 x: @' v' J5 l7 B$ p% I) U' W$ _# O#include <sys/mman.h>9 N8 q3 o& d2 y3 M/ z: S
#include <sys/types.h>
, p+ {" A: _; Y1 J' j4 n#include <fcntl.h>3 E! U8 i2 I8 Y$ J4 b% I, ]# m' a" N

# |" u  e7 F$ ?& s3 D# B#define SHAER_RAM_BASE_ADDR    (0x80000000)
9 N' M5 g+ ]1 _9 F1 s# r#define SHAER_RAM_SIZE         (0x20000)   
% V1 d- l3 i; E3 [! P  {+ _/ T9 s! J* B
typedef struct
; w9 G% z/ y, R4 G. ]/ _{
9 H6 f0 f' x3 E- m# E4 W        unsigned int a;  Z+ h. _- f1 E/ U+ G. W% K, y
        unsigned int b;
- d! j  }) F9 K        unsigned int packet_cout;
3 s) r, k# }) x  o3 s  b8 h9 w}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, r* z% y/ T9 B+ v% y8 u& o6 I2 i9 C- ^  U7 m, h' U) I8 ^
void read_MSG_buffer(int *baseaddr);
: X: X. t; f: S1 H  k/ Yunsigned int count_copy = 0;5 f9 Z) o8 H- v% `

1 h- ]( A9 {5 x1 f1 q7 w. Kint main()% T, c: n& {0 i
{5 K/ J0 a. J& S/ y- P
        int fd;
2 p% A8 @% g. q2 i, {$ H0 x" q        int *mem = NULL;
$ }6 r; l  w5 K+ w- e3 D2 G- \: s
+ g! p( ]! W2 w0 a5 Z        if((fd = open("/dev/mem", O_RDWR)) <0)
: R1 P4 i! T7 V0 q        {. M! E8 ^1 U! `, ~. I, }  L  U1 u, t
                perror("open error");: g2 }; N# o3 u$ S
                return -1;! N+ \5 K5 l0 w+ I' T5 w
        }+ V$ B0 B6 E! @# T. d4 x
        
0 f/ P0 T( f3 D' i% o        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- k, z) O; G. e: [2 {2 Q' M- D( q$ N' r+ Q
        while(1). _- M) M5 f" r8 J, g
        {
; W, q2 C) R7 [) r  _                read_MSG_buffer(mem);
0 e8 |0 F' @( U' {6 Y        }               
  k4 L6 _) p7 \, O% o5 Q- h9 M}
4 C; {7 F) Y9 s6 k7 w0 [$ @
$ w' L- N5 Q) @void read_MSG_buffer(int *baseaddr)- ], @7 o# S* m) {$ j
{
5 R( {- \/ X$ a" C' A        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 ?& ~7 s9 _/ o* d- b' d* M" Q
% B% |. I7 M. _3 U+ c2 t, `! `' H        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;) ~2 F6 P  S; X+ r+ v/ Q

3 [7 `, u& b- l        if(pshreRAM->packet_cout != count_copy). y2 Y! d" ~0 j- a0 U$ q- L
        {
+ ~/ d. Y- v  R1 \7 l                printf("a is %d\n", pshreRAM->a);- a: E. e/ |- p! W
                printf("b is %d\n", pshreRAM->b);
9 P, U$ i6 w4 H9 \+ K& K& k! M                printf("count is %d\n", pshreRAM->packet_cout);
$ M" H3 b7 \- a& T9 F                count_copy = pshreRAM->packet_cout;
4 U/ t2 K( S! J* O        }: y3 \: I+ u& z0 O2 i0 U. x8 p
        else1 u! z6 l; C' p/ A9 C2 h% q
        {
( v9 @/ \4 n, p                printf("No effective message!\n");6 Y; `) u, o5 W3 K$ O2 m
        }
" m" |" ?- r/ A2 |+ i) z: H}7 n# T% S! O: Y7 @+ ~- H  Q  `! j
5 p+ j* Z7 a8 W
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& |3 o& W+ h6 {* Z3 T% P. i" H1 i$ d# U6 P8 V! Y0 k1 z2 M
% e3 [- J, G) I; F

' ]0 Y$ q) C1 l7 m, Q
$ p7 f0 ?# v4 {3 r) H" n  p
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-3 00:50 , Processed in 0.041484 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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