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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 w/ A6 I7 t0 ~) f0 x  [2 {* E* @3 K8 U$ y: q' [
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' M4 n( p; J; a( q  b
#include <unistd.h>* f" i3 J' R+ v. ~( Y! S, Z
#include <sys/mman.h>( I, w9 E: X7 G& f" _; D0 F$ X: o
#include <sys/types.h>$ i. ?. c) Y% e! y8 N, {7 D9 P1 m- _
#include <fcntl.h>" `" c' V4 h+ ^% A
+ M$ ^9 B  e/ I! I1 \
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
+ V9 D4 ]* ^+ V) _6 {/ k) z7 l# S, b/ T  W% L
typedef struct& Z+ e# H) I3 @" L4 u
{
$ H4 p& ~1 J; E+ V        unsigned int a;* j( H0 ~7 r) K0 L" d  v3 F/ ^
        unsigned int b;
8 J, D& l7 r8 X: p- s1 Q% O( F2 n        unsigned int packet_cout;
6 e# M/ P' W1 W" R6 Z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: S2 {4 R% D) B6 I8 ~  v7 H3 |
' }# d( T  Q4 P: K7 a, m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 r9 `7 B% r& L8 l$ L7 W6 }- Cunsigned int count_copy = 0;. k' @+ c/ r6 I4 a6 r
$ M3 V5 e' x4 O* ]! C1 j* i5 [

% V* ^6 Q- I7 g4 @  Rint main()
4 S8 n- r  T0 D- r{
3 d: s5 F  T8 @$ l        pRX_MSG_PROTOCOL pshreRAM = NULL;, ]( D  m& u% c1 Q0 g0 {
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! Z9 o+ Z0 [% W% K& q' K) b; v$ X# @, ^9 v8 w& x" q4 n
        while(1)
0 D6 S. L9 P- C# t* _3 l- K. k4 j- K        {
0 o4 P, L7 L+ g3 K7 [% S1 X7 P                read_MSG_buffer(pshreRAM);/ U) F6 P) |$ i3 U
        }                $ [/ a3 C' \* L, V2 r
}
' n( T* ~4 f. e: W7 T' M$ W) x. y& y0 o8 H/ |/ `
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# F7 b% r3 e% `4 \) i' G$ M{3 R+ O/ b$ |: o# U. F
        RX_MSG_PROTOCOL buf;  C) K) m6 k, u/ {
        
# y( F  C( n8 N2 x+ T        buf.a = pshreRAM->a;
* T6 K9 r" M7 ~# Q        buf.b = pshreRAM->b;0 U$ M! F  t% y
        buf.packet_cout = pshreRAM->packet_cout;
4 ~5 R6 Q" q: X- K4 Q6 H) R& ?        3 K- D8 P7 H% P  R3 o1 V" x
        if(buf.packet_cout != count_copy)
( a2 ]. S8 E/ B( J3 S        {
/ z0 l  M- Q/ A+ w9 N; u# q                printf("a is %d\n", buf.a);
0 Z2 t; w, w  _8 u  z                printf("b is %d\n", buf.b);4 X, a6 }% h! G( W
                printf("count is %d\n", buf.packet_cout);
: T3 S, i5 l3 W. B7 I  F6 E4 _                count_copy = buf.packet_cout;" |9 X4 ^+ e- q( h  T+ e
        }8 m$ q- {1 u: y$ j" H
        else+ @- }5 i  ]0 J4 A0 G8 p
        {
0 n) L+ W0 N5 _8 z* @                printf("No effective message!");
5 c( r+ w+ F9 l/ a        }
+ a- F) `: G* \, |}2 B$ W  @3 j( }8 |4 z5 j: O
. y& @5 G3 |# F$ X; T; k: P) h

8 F) O0 l7 E; O9 \6 |但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" x2 a9 d. p: |7 Z" z
使用下面代码,对内存使用了mmap函数后:; r* I; t: X$ _- U+ e4 B
#include <stdio.h>. c( c5 T; i- j& _9 E' @$ v
#include <unistd.h>4 X# u# X( K" O; ~, {
#include <sys/mman.h>$ Y" V8 w5 M! N7 I! J$ _
#include <sys/types.h>; D2 W9 R; X4 Z8 D( N9 s
#include <fcntl.h>
8 z4 J: @6 B/ s3 @) @. r9 k0 E$ ^9 H7 t
#define SHAER_RAM_BASE_ADDR    (0x80000000)8 z9 P$ {" P4 X, V4 d
#define SHAER_RAM_SIZE         (0x20000)   
) B, |$ ^" z& W% I2 f2 c& ^7 P
/ r0 L3 {/ g5 x9 K3 W& }! i) Stypedef struct7 ~2 E. L# z# n8 \7 \; g& N/ o
{
5 x3 S0 R! V0 ?9 n# ]- m        unsigned int a;
7 ]3 B/ B# [$ B/ d7 O        unsigned int b;
2 D& m$ E. E8 Q6 K! s, i        unsigned int packet_cout;0 ]6 `2 V  @8 B5 [) [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 y9 P$ P) e0 k/ Z& c- C  @+ X0 H6 p. e) \; S( a4 x, L
void read_MSG_buffer(int *baseaddr);
2 _! ]) W4 k# A0 s  X. n7 Gunsigned int count_copy = 0;
* k, |! u  o, y" s6 e+ Y
/ [, I7 @2 Y$ W& I* W* _int main()
" w3 B! ]7 W" E1 y3 r{4 r( h# x: [  T% {
        int fd;, f5 L4 v+ J) ~, x
        int *mem = NULL;
- ]2 s% b4 L/ n% E, C
0 [" Y1 M0 T& b6 b5 ?        if((fd = open("/dev/mem", O_RDWR)) <0)2 Q/ u" S6 v4 u( W9 c0 g$ L4 x
        {& q/ q# W5 j! f
                perror("open error");
1 I; S/ s2 W9 V5 n                return -1;0 b/ {$ w4 C2 D/ h$ {, m
        }# [7 R- F% x4 @: j3 l3 f
        $ a3 ]& L& ]. }6 z$ G- I$ ~' t
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; a6 T0 i7 s; k* W1 j: i: L! V0 o% i& y9 j, C2 M
        while(1)/ b7 R4 p# n; Y1 }5 z
        {$ ~$ c- Q8 B4 E, P" C6 w
                read_MSG_buffer(mem);4 e& k' u& h8 v9 Q
        }                3 ^% ]  f) _9 m& ~+ U6 f
}2 V! {0 z0 d  R8 ~5 b9 P
& e" ?1 M9 z1 A/ q) Z
void read_MSG_buffer(int *baseaddr)) Y9 _7 ^: f9 e& h: m% O. _. i
{
# X5 ?% T0 B  x        pRX_MSG_PROTOCOL pshreRAM = NULL;
# ^& C; s) ]0 n! P8 q/ d
% d0 h0 U& Y/ E3 B* A1 |: _        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 ?( f1 |9 ?- r' c1 y  `
2 K# |0 H; Q" k6 c+ k" o        if(pshreRAM->packet_cout != count_copy)2 O- K2 p6 b8 s; E7 B& H6 T) m" h, E; q
        {& B3 m1 u# e" W% v5 R; B6 \
                printf("a is %d\n", pshreRAM->a);) V' h& `: d5 }
                printf("b is %d\n", pshreRAM->b);% x: Z: D' r6 Z' ^
                printf("count is %d\n", pshreRAM->packet_cout);5 D! M. u0 r1 ], j- v
                count_copy = pshreRAM->packet_cout;  r# x- w$ k9 G& W
        }
& c4 W7 U4 \+ u( ~: P! M0 S        else
1 O1 ~) F* h' N; w: }        {
3 H  d1 M/ u/ D4 G, o- e- }                printf("No effective message!\n");
  u# K- _/ h, {! F) p! q& e- N+ w        }( z% Q( E1 F1 n/ g* `
}( {" v, P: @& u* g. F( D4 |

) G) H( O7 Q( r2 W' v没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ ^2 X. t; m' ^9 j- q8 M
9 N) b5 e# A, @- X
7 C* P- Q6 C- |! o! W2 m( k, P' ]6 j' Y2 d9 O
1 y5 X% O4 h' \# T9 F# e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-12 03:39 , Processed in 0.037952 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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