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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 $ C& n7 u% D. J
% Y, {; ^" }( |4 C
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>/ \0 }) m+ X8 E9 a* g' S4 m
#include <unistd.h>
! {$ q5 C0 x- N; P$ @#include <sys/mman.h>! J- |! B1 N% t  {) R. V
#include <sys/types.h>( a, O9 q, @3 a' b% ]
#include <fcntl.h>9 j0 v* i, `( c5 b
3 U( P! l* q2 E7 X" q
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
% I" R6 f% N0 E) q6 M6 B: @$ ^- f! N' U6 D  H# z/ C
typedef struct) q# y( H- E6 U
{
$ s( M) p2 Y; C+ L* l        unsigned int a;9 d- D" B% {3 l- D
        unsigned int b;% B$ a7 S' n+ W, |: r+ t8 m
        unsigned int packet_cout;
! w& V8 R" D0 q" }}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" `7 J- b/ ^% p& d$ E  ?& A3 i
: B" X, w% g, u* Tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ e% G/ C7 x9 j, j0 j2 h. cunsigned int count_copy = 0;3 v4 P9 I0 p2 k# D% X) \$ p

; \& b  R) q- }4 {; p( g& G! n$ k3 P/ v# W, X& I: f
int main()
* Z; Y$ w, R4 V' H{% @3 L0 x. d1 c' ?
        pRX_MSG_PROTOCOL pshreRAM = NULL;, z( ?( z- u$ m; P
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" j4 p; T0 B9 t
* p& Q/ A2 w7 ~" t0 X        while(1)$ f( H- J1 g) j! d
        {8 ?6 I% G' f; S; U8 Q
                read_MSG_buffer(pshreRAM);
, }0 `( J# z) o0 j9 B% w, G        }                7 e( [( N0 T9 N- F3 c* t
}* u! Y0 C0 G$ p$ v1 }5 R- d

4 k: u8 s8 _+ Jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM): s. R7 @- q; M  }8 ^) v- a
{
1 n* i: n- a5 Q5 h. L( T, o        RX_MSG_PROTOCOL buf;
2 `3 J: f! [, v) h4 o# s$ d        ; z9 F3 x( s& R# R+ J* u
        buf.a = pshreRAM->a;3 \) n# e6 Q! W, Q* }8 O% p3 ^" r
        buf.b = pshreRAM->b;4 ]0 B# F. A$ T! ^% e
        buf.packet_cout = pshreRAM->packet_cout;4 G7 h6 J  k3 i6 K
        ( K' _5 Y- u; a0 u
        if(buf.packet_cout != count_copy)
8 _5 ?. d: I1 m$ }' A5 q0 _& p        {
4 E, \% V! o: n+ [                printf("a is %d\n", buf.a);/ f4 t5 _0 [7 {0 U# A9 b& a4 G
                printf("b is %d\n", buf.b);; U5 W9 C% w; h& W/ u% A
                printf("count is %d\n", buf.packet_cout);
5 e6 k  V8 c6 K                count_copy = buf.packet_cout;
0 ?) w/ m! Z5 l% ~2 p% v        }
& ?# v0 @7 Y/ r7 |& P        else
+ g1 j' n7 r; w7 S        {
4 R8 q+ _0 ]9 d* l4 k& n                printf("No effective message!");
- z  s$ E( q; O! A) g        }5 \  D4 Y5 i6 C, ]1 E
}
2 j& m# t8 G+ k& h- W' l) ]* r
. w: p; e6 f" c# P
/ j, n6 F' \; Y- O8 R  b. L/ d但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) u( E8 F; A" j- I* N使用下面代码,对内存使用了mmap函数后:
; V9 \4 C; J4 T#include <stdio.h>
5 p& |) |: y0 K, E, @$ c" Q#include <unistd.h>
; S# P' B$ \3 n9 K+ j2 C#include <sys/mman.h>
- X( b( T2 N2 I/ b. j#include <sys/types.h>
6 p4 L6 G. r9 ]; L" ~1 W#include <fcntl.h>
8 F% T$ F' y) i6 @. S# E3 H
2 |$ ^" i' S: G#define SHAER_RAM_BASE_ADDR    (0x80000000)- s, Q, y7 H7 u, U6 K' M$ R
#define SHAER_RAM_SIZE         (0x20000)   
. l  g: z6 ]; E/ ~+ c, m, K# e/ w" [
typedef struct
; s% l+ P5 J3 D* W- m% m3 l{8 F) ~# f/ K4 c8 R8 N
        unsigned int a;
2 _4 V. U/ O, C  ]& p9 @/ g        unsigned int b;2 i  I0 d6 O' i/ h& t! w( m2 m4 ], j$ F
        unsigned int packet_cout;5 h9 L$ j. L0 ^. F9 e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ B9 d# i( q; O- _
; s9 f$ g  S4 Ovoid read_MSG_buffer(int *baseaddr);: K3 t5 U% X# t% u
unsigned int count_copy = 0;! N: S+ N# K; i. U& B" m

0 j; t$ X7 Z# B5 s* v9 Hint main()
& I, _/ ?; v9 x! @! M& K{! j8 N4 J  ~8 R. N, |
        int fd;8 N' N+ b: [: u
        int *mem = NULL;
; r/ ^0 u0 G- @/ @$ s1 A# X
/ I" M' M  Q9 i9 w7 ?# c" X* i        if((fd = open("/dev/mem", O_RDWR)) <0)
1 j' }" g* _6 L7 _7 [3 D1 J        {
- N* p- D/ U! M* s                perror("open error");
5 Q0 [: O, G+ u4 ~                return -1;
+ v! V) Q5 j3 e6 z4 n        }7 p( I0 Z1 n- }( Y. R4 b
        " u* n7 a7 n: c# y) L+ j! N
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 j( e- x0 y$ d' |8 O* F" w
& @6 m. O6 |, e7 E        while(1)
0 X" ?/ E1 z1 F9 |. P9 O        {/ N" X' t. p  V  L8 x0 {3 S
                read_MSG_buffer(mem);# A) ^% }+ {; V$ G4 P  w
        }               
% |. g. |9 S2 a" Y  }}& N( L- s2 Z2 d
9 Z' `; _# v2 W1 j! r& T# y( l
void read_MSG_buffer(int *baseaddr)/ t7 T( G. |. G
{; ]8 T0 `  J# q) i) B" }
        pRX_MSG_PROTOCOL pshreRAM = NULL;( I, c8 D$ O8 Z5 k
. X. @6 j+ @2 N. s
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ U2 A* z0 Y; M! w3 l  ~5 a  w8 ~

* ~6 N9 g3 {$ ^9 o        if(pshreRAM->packet_cout != count_copy)8 l& D% B" ~' y. L" k
        {
: F. {( V# l- P9 ~                printf("a is %d\n", pshreRAM->a);6 ]% i5 x  `* z" i% t
                printf("b is %d\n", pshreRAM->b);
6 G+ z8 F  c+ z' T                printf("count is %d\n", pshreRAM->packet_cout);5 _9 k! E$ n7 s( b& Y$ K
                count_copy = pshreRAM->packet_cout;
" U2 a6 G: {! ^' G, A9 T, A5 C        }
, |$ U  y  A6 M        else' a) z) V. S- T. ~# D; w
        {' y; g& x0 R% s3 Y
                printf("No effective message!\n");- y0 C3 i- E5 e' y! X2 P% n
        }' {$ }+ e! U" i* D
}6 d! _" T) e! V1 w6 e
( k: v1 _) B, `+ }' I
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???2 I! W* I. K. E% r' Z
$ Q4 d( v  I* ~7 e# V7 k6 [
( d1 z  [0 s1 j7 A, B) Q+ g% L

. B, M8 V1 y9 q9 ]6 d2 R# N4 |. {+ n/ W  }7 o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-21 15:11 , Processed in 0.037468 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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