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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 0 c* _% X8 Y. s9 J( s; f0 H

( A5 B& [7 i+ r- L0 vOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 u, O+ _7 m& n# K; a7 v#include <unistd.h>/ q" Z$ }5 w2 K9 e
#include <sys/mman.h>
* m2 t# g" q* J4 N#include <sys/types.h>  d+ L# `* f  k
#include <fcntl.h>. g% A0 Z& e% n

) P, P! t2 s2 q#define SHAER_RAM_BASE_ADDR    (0x80000000)   $ h: U, e) a1 Q6 u8 K

6 e8 Z* l& |# }& Z% v. ^) otypedef struct6 I" z) e) M" U; N4 ^
{/ Z: x+ |2 d9 h+ i9 d! F/ n
        unsigned int a;
& n0 r( x! ?. i/ N# e. p/ W6 d+ Q        unsigned int b;: F- c' N8 \  ~8 r) T, P8 E
        unsigned int packet_cout;6 N( g; \0 d* u4 K! C# r1 d- H4 V/ H; f
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 h5 n6 M2 N  N( j- o

% m5 P0 a4 _) H7 n0 hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);- w6 m7 O+ y; f5 h* w, z* ?& w
unsigned int count_copy = 0;
8 J6 ]3 l# h! a9 z; m* _
) q3 w& a8 d  Q$ [: s1 G4 A
6 c9 Q$ _4 l" j, fint main()$ q+ A& t# ]5 W# y4 W
{! Z- z, U  D5 k, }
        pRX_MSG_PROTOCOL pshreRAM = NULL;
, b. F, W  h/ ~' T1 I- M& l        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 Y& p4 p% l& {- @8 F2 C. ]
6 ^) P! k1 }1 e( x$ u; T: h- C        while(1)
* W* r" r% i+ a3 M7 Q        {. X6 W/ \* J* _: t; F
                read_MSG_buffer(pshreRAM);4 {7 ?+ u6 i8 O1 g, h- S! s* V8 ~, u
        }               
  A2 ?+ C; g" [$ I  A3 E+ P% ~5 P}! E) |2 b4 W, c  _

8 \" W% f# m9 H; J2 mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
& P, G  n0 H! G% Y9 n{4 _' E7 a: |( l. O
        RX_MSG_PROTOCOL buf;7 F# ^: G! l1 e8 T/ F
        
8 i% y" O. c/ Y3 ^        buf.a = pshreRAM->a;4 D# g) ]- h4 E2 m3 i/ |; T: }
        buf.b = pshreRAM->b;
, \$ z* s" G  X* m# s        buf.packet_cout = pshreRAM->packet_cout;
! f. J& A* ~8 \. _! S; p) r0 o% k+ O        
5 a8 ~6 _6 H. U0 n" _+ H# F8 [$ F        if(buf.packet_cout != count_copy)
" S# B8 w6 ~9 v4 b# A* c        {( b6 `0 L3 ~+ ^' Z( i
                printf("a is %d\n", buf.a);
6 k. ~3 W; j6 I# E8 R+ d" d8 r" G                printf("b is %d\n", buf.b);' i' k4 m# b5 M6 Z' V% L0 E0 F
                printf("count is %d\n", buf.packet_cout);
# G) h! ~1 M! T                count_copy = buf.packet_cout;
) v4 F3 B, H  J: V  M        }
# F- B, Q  w& \( e2 Z6 n0 }        else" w5 J+ }: ~4 r- n" K" a7 F6 r
        {( N( E% Y8 O; o3 J/ C
                printf("No effective message!");1 v! K- J) |: U) r. L- K# f$ K
        }$ E' Y: r; G4 |" e
}
* p( j- N  E7 t: Y; N7 ^! X' Z+ B& |' E
  F6 [9 T6 k/ ^0 ?/ R& l
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* I6 l0 e: ~; Q* j使用下面代码,对内存使用了mmap函数后:3 y5 z, S* @) h9 Q3 Q$ I
#include <stdio.h>) L* S: q, Q: b1 N4 [
#include <unistd.h>
( W! L! G$ ?) L" m5 F9 U1 @#include <sys/mman.h>7 v" U7 m6 X- ~3 y6 {0 U, k& d, f' t: ^
#include <sys/types.h>
) Z- L7 M' h( |#include <fcntl.h>0 P# w  Q" n- ^: J/ p- v* L

5 _( n% r- h' |$ R  }) p8 z#define SHAER_RAM_BASE_ADDR    (0x80000000)$ k4 o: i3 a8 G# u  X
#define SHAER_RAM_SIZE         (0x20000)   8 B4 t5 t! V8 s( g

" r) k5 Z" ]7 f2 B' O; e' Q, ]typedef struct
$ i: k6 B" f2 U1 v{9 W& P7 `* u2 C
        unsigned int a;
; [2 _4 Y8 N1 R1 |6 Y  {0 t        unsigned int b;. \- E* |( s) S
        unsigned int packet_cout;
) X; y/ r( m3 \; }}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; D0 q  e+ `) K  v* _7 E9 Y) {5 o- j$ V/ s
void read_MSG_buffer(int *baseaddr);
& x9 K2 A% [* u2 [# A8 @$ v1 Munsigned int count_copy = 0;7 S& |% S# J0 c# L) i
* L1 X$ q2 |! l# X
int main()
- B# }# l, e8 n{
" ]3 G' G* z. K* D0 s        int fd;& e; x' L  S1 y5 `2 j
        int *mem = NULL;1 E  }0 w, F. U# f

9 d5 l+ Q& N* {' ?2 i        if((fd = open("/dev/mem", O_RDWR)) <0)' w- [! ?% `9 v7 @# i! ~
        {4 h) W8 _9 g* e
                perror("open error");' E) y) W$ q+ k. {( Y$ n8 r
                return -1;" U' J3 h) A( o2 p$ T
        }
6 s8 V7 \+ d1 y, A, p9 H        , |- a. x! U8 b8 a: T' _, k: ~
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ X" R- Q7 u' _

; E4 ^( O- B2 n& y        while(1)
; x3 [' z1 I/ D& E1 Z6 d- |        {1 v% x7 z8 }  F# V' R
                read_MSG_buffer(mem);
! ]8 B/ ?: C- M( ^# R" \/ w        }               
0 G& ?/ v9 w( M  @  F}
& {* ]! {' X1 ?1 j3 o
/ u5 b3 L# V9 b4 T' rvoid read_MSG_buffer(int *baseaddr)- `; s; s; Q" X* \- {
{; f$ J' o4 P4 I1 z4 w. A
        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ |% j, ^; P6 V8 t) G' q3 P, d6 s" O$ |8 U0 E
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" M& p: b- M% n( w0 a& W4 x6 I9 G8 D; `9 f  u5 n4 y! L: p0 r
        if(pshreRAM->packet_cout != count_copy)! A! ~! N; f9 A, r
        {( r2 A6 h6 P& B* [  l/ \( O
                printf("a is %d\n", pshreRAM->a);; P: ^$ e( R  \0 R# s1 F  `
                printf("b is %d\n", pshreRAM->b);" @, [/ j, n, }2 Z, v! l4 ?
                printf("count is %d\n", pshreRAM->packet_cout);. p  a- ~" K3 L" x9 U+ E
                count_copy = pshreRAM->packet_cout;* t2 b" [5 y7 S4 s4 y- O! g/ i
        }* _% i' a# E& ^8 Q; U/ i" ]
        else
5 ^. @$ x9 Y% ~        {
2 d  U5 Y- X5 L6 N4 e0 P1 w                printf("No effective message!\n");
6 f$ Z/ B5 V5 N6 Z' Y0 {        }' V0 e1 f; ]+ a; h; n6 o' ]  X: L* B
}
* V1 f9 h  N" q! b: @1 n% k, _3 F
( U# Q% ^% R* i! S没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???  k; n+ _; N3 |% k4 }- H5 [

4 `3 t. ^) L2 e+ X- s& Y1 h6 ^  [  n/ X9 `. c; K: E0 a, V
8 ~  c6 N4 B' B4 x
4 o- F/ @! o& O' J: ?, j
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-7 18:38 , Processed in 0.040858 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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